枚举算法的思想是:将问题的所有可能答案全部列举,紧跟着根据条件判断答案是否合适,保存合适的,丢掉不合适的。在python中一般使用while或者if语句实现。
24点游戏:
规则:54张牌中除去JQK以及大小王只剩下40张牌,抽取四张,用加减乘除以及括号将牌面上的数字算为24点,如抽到1、2、3、4,可以这样计算:((1+2)+3)*4;高级玩家可以添加JQK以及乘方开方运算
使用穷举法进行运算:
import itertools
cards = [xfor xin range(1,11)]*4 #列表推导式
rst = []
for numsin itertools.permutations(cards,4): #从中枚举四位数
for ops in itertools.product("+-*/",repeat=3):#从中选取三个,可重复
#使用三条中缀表达式对算式进行构造,0123是数字,456是运算符
bds1 ="({0}{4}{1}){5}({2}{6}{3})".format(*nums,*ops)
bds2 ="(({0}{4}{1}){5}{2}){6}{3}".format(*nums,*ops)
bds3 ="{0}{4}({1}{5}({2}{6}{3}))".format(*nums,*ops)
for bdsin [bds1,bds2,bds3]:
try:
if eval(bds) ==24 and bdsnot in rst: #去重
rst.append(bds)
print(bds)
except ZeroDivisionError:
continue
结果:(取部分结果)
((1+2)+3)*4
(1*2)*(3*4)
((1*2)*3)*4
1*(2*(3*4))
(1+2)*(3+5)
(1+2)+(3*7)
1+(2+(3*7))
(1*2)*(3+9)