穷举法解决24点计算问题的Python代码

dgsweb4213年前软件设计与编程761

    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")


相关文章

STM32单片机嵌入式实战教程

文章摘自我要自学网课程:STM32单片机嵌入式实战教程地址:https://www.51zxw.net/list.aspx?cid=552...

51单片机视频教程

文章摘自我要自学网教程:51单片机视频教程本教程讲解了基础模拟电路和数字电路,以及51单片机的相关应用编程技术。地址:https://www.51zxw.net/list.aspx?cid=473...

C#入门教程

文章摘自我要自学网课程:C#入门教程地址:https://www.51zxw.net/List.aspx?cid=548...

C语言基础入门

文章摘自我要自学网课程:C语言基础入门地址:https://www.51zxw.net/List.aspx?cid=329...

使用Python创建24点题库和答案库

使用Python创建24点题库和答案库

24点游戏的4个数并不是乱出的,它必须符合一定的条件才能计算得出24,否则题目无解。本文使用Python编写一个生成24点题库,希望能枚举所有小于某个最大数以内的所有可能解。代码如下:# 2...

使用Python多进程技术计算24点游戏题库

使用Python多进程技术计算24点游戏题库

上一篇文章中,我们使用的穷举法计算了最大数13以下的24点游戏题库。由于使用了单进程单线程的算法方式,计算速度相对较慢。这篇文章,我们使用Python的多进程技术,来计算最大数27以下的24点题库。代...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。