题解 | #24点运算#
24点运算
https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
import copy poker_value = {'J':'11', 'Q':'12', 'K':'13', 'A':'1'} value_poker = {11:'J', 12:'Q', 13:'K', 1:'A'} op = [[0, 0], [0, 1], [1, 0], [1, 1]] def op_symbol(operation): if operation == [1, 0]: return '+' elif operation == [1, 1]: return '-' elif operation == [0, 0]: return '*' else: return '/' def num2poker(num): if 2 <= num <= 10: return str(num) else: return value_poker[num] def cal(num1, num2, operation): if operation == [1, 0]: return num1+num2 elif operation == [1, 1]: return num1-num2 elif operation == [0, 0]: return num1*num2 else: return num1//num2 fetched = input().split(' ') # fetched = ['4', '2', 'K', 'A'] fetched_1 = copy.deepcopy(fetched) if 'joker' in fetched or 'JOKER' in fetched: print('ERROR') else: for i, v in enumerate(fetched): if v in poker_value.keys(): fetched[i] = poker_value[v] fetched_2 = list(map(int, fetched)) game_win = 0 for i in op: for j in op: for k in op: candidates = copy.deepcopy(fetched_2) for ii in range(len(candidates)): c1 = candidates[ii]*1 candidates_l1 = copy.deepcopy(candidates) del candidates_l1[ii] for jj in range(len(candidates_l1)): c2 = candidates_l1[jj]*1 candidates_l2 = copy.deepcopy(candidates_l1) del candidates_l2[jj] for mm in range(len(candidates_l2)): c3 = candidates_l2[mm]*1 candidates_l3 = copy.deepcopy(candidates_l2) del candidates_l3[mm] c4 = candidates_l3[0]*1 fetched = [c1, c2, c3, c4] fetched_3 = [c1, c2, c3, c4] ops = [[0, i], [1, j], [2, k]] for n, o in enumerate(ops): # print(i ,j, k, ii, jj, mm, fetched, ops, o[0]) fetched[o[0]] = cal(fetched[o[0]], fetched[o[0]+1], o[1]) del fetched[o[0]+1] for m in range(len(ops[n:])): ops[n+m][0] -= 1 if fetched[0] == 24: print(num2poker(fetched_3[0])+op_symbol(ops[0][1])+num2poker(fetched_3[1])+op_symbol(ops[1][1])+num2poker(fetched_3[2])+op_symbol(ops[2][1])+num2poker(fetched_3[3])) game_win = 1 break if game_win: break if game_win: break if game_win: break if game_win: break if game_win: break if not game_win: print('NONE')
暴力解法,列举所有的操作符排列组合,列举所有的操作数排列组合
- 操作数的排列组合写法,每一层循环代表在当前位置的所有可能值,下一层循环中临时删掉这个值,以此类推
- 从左至右运算写法,维护一个操作数列表,运算完一次就把列表的前两个元素合并为运算结果,同时操作符列表后续的索引号减一(为了对应操作数列表的长度变化)
期初以为要考虑四则运算顺序,方法2也适用,首先对操作符进行排序,在把中间的两个操作数合并为运算结果后,在操作符列表中,位置索引大于当前值的值减一