穷举法解决24点计算问题的Python代码
24点的玩法:
给出4个数字,找到一个正确的加减乘除和括号运算方法,使得结果为24.
比如:给4个数为:1, 8, 10, 12
答案:1*12*(10-8)= 24
这个算式便是正确答案。
下面给出Python穷举法的代码,供爱思考的人参考。
以下代码可以复制到在线python网站,完成运行演示。https://c.runoob.com/compile/9/
a = 5 b = 8 c = 10 d = 12 ops={'0'} ops.discard('0') op = ['+', '-', '*', '/'] for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('A' +op[i] +'B' +op[j] +'C'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('(A' +op[i] +'B)' +op[j] +'C'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('A' +op[i] +'(B' +op[j] +'C)'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('(A' +op[i] +'B)' +op[j] +'(C'+ op[k]+ 'D)') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('(A' +op[i] +'B' +op[j] +'C)'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('A' +op[i] +'(B' +op[j] +'C'+ op[k]+ 'D)') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('((A' +op[i] +'B)' +op[j] +'C)'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('(A' +op[i] +'(B' +op[j] +'C))'+ op[k]+ 'D') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('A' +op[i] +'(B' +op[j] +'(C'+ op[k]+ 'D))') for i in range(0,4): for j in range(0,4): for k in range(0,4): ops.add('A' +op[i] +'((B' +op[j] +'C)'+ op[k]+ 'D)') pos={'0123'} for i in range(0,4): for j in range(0,4): if j==i: continue for k in range(0,4): if (k==i) or (k == j): continue for l in range(0,4): if (l==i) or (l==j) or (l==k): continue pos.add(str(i)+str(j)+str(k)+str(l)) opsall={'0'} opsall.discard('0') Alpha='ABCD' alpha='abcd' for ipos in pos: for iops in ops: s = iops for kk in range(0,4): s = s.replace(Alpha[kk], alpha[int(ipos[kk])]) opsall.add(s) resultflag = 0 for itemop in opsall: try: o=itemop if o.find('/')>=0: o=o.replace('a', 'AA') o=o.replace('b', 'float(b)') o=o.replace('c', 'float(c)') o=o.replace('d', 'float(d)') o=o.replace('AA', 'a') res = eval(o) if res==24: s=itemop s=s.replace('a', str(a)) s=s.replace('b', str(b)) s=s.replace('c', str(c)) s=s.replace('d', str(d)) resultflag=1 print(s + ' = 24') break except: continue else: continue if resultflag==0: print("It's impossible")