1. 程式人生 > 其它 >華為機試題 24點

華為機試題 24點

演算法題 24點

計算24點

1、描述

計算24點是一種撲克牌益智遊戲,隨機抽出4張撲克牌,通過加(+),減(-),乘(*),(/)四種運演算法則計算得到整數24

本問題中,撲克牌通過如下字元或者字串表示,其中,小寫joker表示小王,大寫JOKER表示大王:

345678910JQKA2jokerJOKER

本程式要求實現:輸入4張牌,輸出一個算式,算式的結果為24點。

題目地址牛客網地址

2、解題思路

暴力法窮舉所有的可能的組合(題目只需找到任意滿足24點的式子即可)。

4 x 4 x 3 x 4 x 2 x 4 x 1= 256 x 6 = 1536 (每層需查詢4種算符)

主要難點是7層迴圈內部的剪枝,即候選的數字的剪枝,內層的數字不要和外層重複

(抽出來的4張牌可能重複,即牌面的數值會重複,而牌不能重複-對應位置的牌在式子中只出現一次

3、程式碼

pokers = input().split(" ")

pok_2_digit = {'J': 11, 'Q': 12, 'K': 13, 'A': 1}
digit_2_pok = {pok_2_digit[k]: k for k in pok_2_digit}

digits = []
flag = False
for pok in pokers:
    if len(pok) != 5:
        
if pok.isdigit(): digits.append(int(pok)) else: digits.append(pok_2_digit[pok]) else: flag = True break if flag == True: print('ERROR') else: def operate(nums, opers): res = nums[0] for i in range(len(opers)): num
= nums[i+1] oper = opers[i] if oper == '+': res += num elif oper == '-': res -= num elif oper == '*': res *= num elif oper == '/': res = res // num return res def output(res_nums, res_opers): nums = [] for num in res_nums: if num in digit_2_pok: nums.append(digit_2_pok[num]) else: nums.append(str(num)) res = [nums[0]] for i in range(len(res_opers)): res.append(res_opers[i]) res.append(nums[i+1]) return "".join(res) opers = ['+', '-', '*', '/'] def check_24(digits, opers): n = len(digits) for i1 in range(n): d1 = digits[i1] for o1 in opers: for i2 in range(n): if i2 != i1: d2 = digits[i2] for o2 in opers: for i3 in range(n): if i3 != i2 and i3 != i1: d3 = digits[i3] for o3 in opers: for i4 in range(n): if i4 != i3 and i4 != i2 and i4 != i1: d4 = digits[i4] enum_nums = (d1, d2, d3, d4) enum_opers = (o1, o2, o3) if operate(enum_nums, enum_opers) == 24: return output(enum_nums, enum_opers) return None result = check_24(digits, opers) if result: print(result) else: print('NONE')