華為機試題 24點
阿新 • • 發佈:2021-07-12
演算法題 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')