穷举法解决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")