1.什么是枚举算法?
枚举算法也叫穷举算法,最大特点是在面对任何情况时会尝试每一种解决方法。在进行归纳推力时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这个结论是可靠的,这种归纳方法叫做枚举法
2.枚举算法的基础
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断答案是否合适,保留合适的,丢弃不合适的。
python中一般用while循环或if语句实现。
使用枚举算法的基本思路:
(1)确定枚举对象、枚举范围和判定条件。
(2) 逐一列举可能的解,验证每个解是否是问题的解
一般情况下,按照下面三个步骤进行:
(1)解的可能范围,不能遗漏任何一个真正解,也要避免有重复。
(2)判断是否是真正解的方法
(3)使可能解的范围降至最小,以便提高解决问题的效率
3.枚举算法计算24点游戏
24点是一款经典的棋牌类益智游戏,要求四个数字的运算结果等于二十四。 即 用加、减、乘、除把牌面上的数算成24.
每张牌必须且只能用一次, 例如: 抽出的牌为3、8、8、9,那么 (9-8)×8×3=24
# 枚举算法 # 24点游戏 import itertools # 计算24点游戏代码 def twentyfour(cards): """ (1)itertools.permutations(可迭代对象): 通俗地讲,就是返回可迭代对象的所有数学全排列方式。 itertools.permutations("1118") -> 即将数字1118进行全排列组合 (2)itertools.product(*iterables, repeat=1) iterables是可迭代对象,repeat指定iterable重复几次 返回一个或者多个iterables中的元素的笛卡尔积的元组 即为product(list1, list2) 依次取出list1中的每1个元素,与list2中的每1个元素,组成元组, repeat即为元组中有几个元素,最多重复几次 (3) """ for num in itertools.permutations(cards): for ops in itertools.product("+-*/", repeat=3): # ({0}{4}{1}){5}({2}{6}{3}) - > 即在{0}{1}{2}{3}放上数字,{4}{5}{6}放上运算符号,只能放三个,四个数字中间只能放三个运算符 # 带括号有8种方法 # 1. (ab)cd bsd1 = '({0}{4}{1}){5}{2}{6}{3}'.format(*num, *ops) # 2. a(bc)d bsd2 = '{0}{4}({1}{5}{2}){6}{3}'.format(*num, *ops) # 3. ab(cd) bsd3 = '{0}{4}{1}{5}({2}{6}{3})'.format(*num, *ops) # 4. (ab)(cd) bsd4 = '({0}{4}{1}){5}({2}{6}{3})'.format(*num, *ops) # 5. ((ab)c)d bsd5 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*num, *ops) # 6. (a(bc))d bsd6 = '({0}{4}({1}{5}{2})){6}{3}'.format(*num, *ops) # 7. a((bc)d) bsd7 = '{0}{4}(({1}{5}{2}){6}{3})'.format(*num, *ops) # 8. a(b(cd)) bsd8 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*num, *ops) # print([bsd1, bsd2, bsd3, bsd4, bsd5, bsd6, bsd7, bsd8]) for bds in [bsd1, bsd2, bsd3, bsd4, bsd5, bsd6, bsd7, bsd8]: try: if abs(eval(bds) - 24.0) < 1e-20: return "24点结果 = "+bds except ZeroDivisionError: # 零除错误 continue return "Not fond" cards = ['2484', '1126', '1127', '1128', '2484', '1111'] for card in cards: print(twentyfour(card))
运行结果: cards中的牌数,最终通过加减乘除得出24,而1111这四个数不能通过加减乘除得到24,返回值
我们可以通过到4个数字组成的8种带括号形式,可以看出,4个中的每个数字以及每个符号,可能的各种组合都试试,直到找到四个数字通过加减乘除给哪一块带括号,算出结果24. 这就是枚举算法思想
用24点游戏中很难算的4156这四个数字举出下面例子看其过程: 因为很难算,所以试的过程也就更多
""" ['(4+1)+5+6', '4+(1+5)+6', '4+1+(5+6)', '(4+1)+(5+6)', '((4+1)+5)+6', '(4+(1+5))+6', '4+((1+5)+6)', '4+(1+(5+6))'] ['(4+1)+5-6', '4+(1+5)-6', '4+1+(5-6)', '(4+1)+(5-6)', '((4+1)+5)-6', '(4+(1+5))-6', '4+((1+5)-6)', '4+(1+(5-6))'] ['(4+1)+5*6', '4+(1+5)*6', '4+1+(5*6)', '(4+1)+(5*6)', '((4+1)+5)*6', '(4+(1+5))*6', '4+((1+5)*6)', '4+(1+(5*6))'] ['(4+1)+5/6', '4+(1+5)/6', '4+1+(5/6)', '(4+1)+(5/6)', '((4+1)+5)/6', '(4+(1+5))/6', '4+((1+5)/6)', '4+(1+(5/6))'] ['(4+1)-5+6', '4+(1-5)+6', '4+1-(5+6)', '(4+1)-(5+6)', '((4+1)-5)+6', '(4+(1-5))+6', '4+((1-5)+6)', '4+(1-(5+6))'] ['(4+1)-5-6', '4+(1-5)-6', '4+1-(5-6)', '(4+1)-(5-6)', '((4+1)-5)-6', '(4+(1-5))-6', '4+((1-5)-6)', '4+(1-(5-6))'] ['(4+1)-5*6', '4+(1-5)*6', '4+1-(5*6)', '(4+1)-(5*6)', '((4+1)-5)*6', '(4+(1-5))*6', '4+((1-5)*6)', '4+(1-(5*6))'] ['(4+1)-5/6', '4+(1-5)/6', '4+1-(5/6)', '(4+1)-(5/6)', '((4+1)-5)/6', '(4+(1-5))/6', '4+((1-5)/6)', '4+(1-(5/6))'] ['(4+1)*5+6', '4+(1*5)+6', '4+1*(5+6)', '(4+1)*(5+6)', '((4+1)*5)+6', '(4+(1*5))+6', '4+((1*5)+6)', '4+(1*(5+6))'] ['(4+1)*5-6', '4+(1*5)-6', '4+1*(5-6)', '(4+1)*(5-6)', '((4+1)*5)-6', '(4+(1*5))-6', '4+((1*5)-6)', '4+(1*(5-6))'] ['(4+1)*5*6', '4+(1*5)*6', '4+1*(5*6)', '(4+1)*(5*6)', '((4+1)*5)*6', '(4+(1*5))*6', '4+((1*5)*6)', '4+(1*(5*6))'] ['(4+1)*5/6', '4+(1*5)/6', '4+1*(5/6)', '(4+1)*(5/6)', '((4+1)*5)/6', '(4+(1*5))/6', '4+((1*5)/6)', '4+(1*(5/6))'] ['(4+1)/5+6', '4+(1/5)+6', '4+1/(5+6)', '(4+1)/(5+6)', '((4+1)/5)+6', '(4+(1/5))+6', '4+((1/5)+6)', '4+(1/(5+6))'] ['(4+1)/5-6', '4+(1/5)-6', '4+1/(5-6)', '(4+1)/(5-6)', '((4+1)/5)-6', '(4+(1/5))-6', '4+((1/5)-6)', '4+(1/(5-6))'] ['(4+1)/5*6', '4+(1/5)*6', '4+1/(5*6)', '(4+1)/(5*6)', '((4+1)/5)*6', '(4+(1/5))*6', '4+((1/5)*6)', '4+(1/(5*6))'] ['(4+1)/5/6', '4+(1/5)/6', '4+1/(5/6)', '(4+1)/(5/6)', '((4+1)/5)/6', '(4+(1/5))/6', '4+((1/5)/6)', '4+(1/(5/6))'] ['(4-1)+5+6', '4-(1+5)+6', '4-1+(5+6)', '(4-1)+(5+6)', '((4-1)+5)+6', '(4-(1+5))+6', '4-((1+5)+6)', '4-(1+(5+6))'] ['(4-1)+5-6', '4-(1+5)-6', '4-1+(5-6)', '(4-1)+(5-6)', '((4-1)+5)-6', '(4-(1+5))-6', '4-((1+5)-6)', '4-(1+(5-6))'] ['(4-1)+5*6', '4-(1+5)*6', '4-1+(5*6)', '(4-1)+(5*6)', '((4-1)+5)*6', '(4-(1+5))*6', '4-((1+5)*6)', '4-(1+(5*6))'] ['(4-1)+5/6', '4-(1+5)/6', '4-1+(5/6)', '(4-1)+(5/6)', '((4-1)+5)/6', '(4-(1+5))/6', '4-((1+5)/6)', '4-(1+(5/6))'] ['(4-1)-5+6', '4-(1-5)+6', '4-1-(5+6)', '(4-1)-(5+6)', '((4-1)-5)+6', '(4-(1-5))+6', '4-((1-5)+6)', '4-(1-(5+6))'] ['(4-1)-5-6', '4-(1-5)-6', '4-1-(5-6)', '(4-1)-(5-6)', '((4-1)-5)-6', '(4-(1-5))-6', '4-((1-5)-6)', '4-(1-(5-6))'] ['(4-1)-5*6', '4-(1-5)*6', '4-1-(5*6)', '(4-1)-(5*6)', '((4-1)-5)*6', '(4-(1-5))*6', '4-((1-5)*6)', '4-(1-(5*6))'] ['(4-1)-5/6', '4-(1-5)/6', '4-1-(5/6)', '(4-1)-(5/6)', '((4-1)-5)/6', '(4-(1-5))/6', '4-((1-5)/6)', '4-(1-(5/6))'] ['(4-1)*5+6', '4-(1*5)+6', '4-1*(5+6)', '(4-1)*(5+6)', '((4-1)*5)+6', '(4-(1*5))+6', '4-((1*5)+6)', '4-(1*(5+6))'] ['(4-1)*5-6', '4-(1*5)-6', '4-1*(5-6)', '(4-1)*(5-6)', '((4-1)*5)-6', '(4-(1*5))-6', '4-((1*5)-6)', '4-(1*(5-6))'] ['(4-1)*5*6', '4-(1*5)*6', '4-1*(5*6)', '(4-1)*(5*6)', '((4-1)*5)*6', '(4-(1*5))*6', '4-((1*5)*6)', '4-(1*(5*6))'] ['(4-1)*5/6', '4-(1*5)/6', '4-1*(5/6)', '(4-1)*(5/6)', '((4-1)*5)/6', '(4-(1*5))/6', '4-((1*5)/6)', '4-(1*(5/6))'] ['(4-1)/5+6', '4-(1/5)+6', '4-1/(5+6)', '(4-1)/(5+6)', '((4-1)/5)+6', '(4-(1/5))+6', '4-((1/5)+6)', '4-(1/(5+6))'] ['(4-1)/5-6', '4-(1/5)-6', '4-1/(5-6)', '(4-1)/(5-6)', '((4-1)/5)-6', '(4-(1/5))-6', '4-((1/5)-6)', '4-(1/(5-6))'] ['(4-1)/5*6', '4-(1/5)*6', '4-1/(5*6)', '(4-1)/(5*6)', '((4-1)/5)*6', '(4-(1/5))*6', '4-((1/5)*6)', '4-(1/(5*6))'] ['(4-1)/5/6', '4-(1/5)/6', '4-1/(5/6)', '(4-1)/(5/6)', '((4-1)/5)/6', '(4-(1/5))/6', '4-((1/5)/6)', '4-(1/(5/6))'] ['(4*1)+5+6', '4*(1+5)+6', '4*1+(5+6)', '(4*1)+(5+6)', '((4*1)+5)+6', '(4*(1+5))+6', '4*((1+5)+6)', '4*(1+(5+6))'] ['(4*1)+5-6', '4*(1+5)-6', '4*1+(5-6)', '(4*1)+(5-6)', '((4*1)+5)-6', '(4*(1+5))-6', '4*((1+5)-6)', '4*(1+(5-6))'] ' ' ' 中间的结果太长太长所以省略一部分 ' ' ' ['(6-5)-4*1', '6-(5-4)*1', '6-5-(4*1)', '(6-5)-(4*1)', '((6-5)-4)*1', '(6-(5-4))*1', '6-((5-4)*1)', '6-(5-(4*1))'] ['(6-5)-4/1', '6-(5-4)/1', '6-5-(4/1)', '(6-5)-(4/1)', '((6-5)-4)/1', '(6-(5-4))/1', '6-((5-4)/1)', '6-(5-(4/1))'] ['(6-5)*4+1', '6-(5*4)+1', '6-5*(4+1)', '(6-5)*(4+1)', '((6-5)*4)+1', '(6-(5*4))+1', '6-((5*4)+1)', '6-(5*(4+1))'] ['(6-5)*4-1', '6-(5*4)-1', '6-5*(4-1)', '(6-5)*(4-1)', '((6-5)*4)-1', '(6-(5*4))-1', '6-((5*4)-1)', '6-(5*(4-1))'] ['(6-5)*4*1', '6-(5*4)*1', '6-5*(4*1)', '(6-5)*(4*1)', '((6-5)*4)*1', '(6-(5*4))*1', '6-((5*4)*1)', '6-(5*(4*1))'] ['(6-5)*4/1', '6-(5*4)/1', '6-5*(4/1)', '(6-5)*(4/1)', '((6-5)*4)/1', '(6-(5*4))/1', '6-((5*4)/1)', '6-(5*(4/1))'] ['(6-5)/4+1', '6-(5/4)+1', '6-5/(4+1)', '(6-5)/(4+1)', '((6-5)/4)+1', '(6-(5/4))+1', '6-((5/4)+1)', '6-(5/(4+1))'] ['(6-5)/4-1', '6-(5/4)-1', '6-5/(4-1)', '(6-5)/(4-1)', '((6-5)/4)-1', '(6-(5/4))-1', '6-((5/4)-1)', '6-(5/(4-1))'] ['(6-5)/4*1', '6-(5/4)*1', '6-5/(4*1)', '(6-5)/(4*1)', '((6-5)/4)*1', '(6-(5/4))*1', '6-((5/4)*1)', '6-(5/(4*1))'] ['(6-5)/4/1', '6-(5/4)/1', '6-5/(4/1)', '(6-5)/(4/1)', '((6-5)/4)/1', '(6-(5/4))/1', '6-((5/4)/1)', '6-(5/(4/1))'] ['(6*5)+4+1', '6*(5+4)+1', '6*5+(4+1)', '(6*5)+(4+1)', '((6*5)+4)+1', '(6*(5+4))+1', '6*((5+4)+1)', '6*(5+(4+1))'] ['(6*5)+4-1', '6*(5+4)-1', '6*5+(4-1)', '(6*5)+(4-1)', '((6*5)+4)-1', '(6*(5+4))-1', '6*((5+4)-1)', '6*(5+(4-1))'] ['(6*5)+4*1', '6*(5+4)*1', '6*5+(4*1)', '(6*5)+(4*1)', '((6*5)+4)*1', '(6*(5+4))*1', '6*((5+4)*1)', '6*(5+(4*1))'] ['(6*5)+4/1', '6*(5+4)/1', '6*5+(4/1)', '(6*5)+(4/1)', '((6*5)+4)/1', '(6*(5+4))/1', '6*((5+4)/1)', '6*(5+(4/1))'] ['(6*5)-4+1', '6*(5-4)+1', '6*5-(4+1)', '(6*5)-(4+1)', '((6*5)-4)+1', '(6*(5-4))+1', '6*((5-4)+1)', '6*(5-(4+1))'] ['(6*5)-4-1', '6*(5-4)-1', '6*5-(4-1)', '(6*5)-(4-1)', '((6*5)-4)-1', '(6*(5-4))-1', '6*((5-4)-1)', '6*(5-(4-1))'] ['(6*5)-4*1', '6*(5-4)*1', '6*5-(4*1)', '(6*5)-(4*1)', '((6*5)-4)*1', '(6*(5-4))*1', '6*((5-4)*1)', '6*(5-(4*1))'] ['(6*5)-4/1', '6*(5-4)/1', '6*5-(4/1)', '(6*5)-(4/1)', '((6*5)-4)/1', '(6*(5-4))/1', '6*((5-4)/1)', '6*(5-(4/1))'] ['(6*5)*4+1', '6*(5*4)+1', '6*5*(4+1)', '(6*5)*(4+1)', '((6*5)*4)+1', '(6*(5*4))+1', '6*((5*4)+1)', '6*(5*(4+1))'] ['(6*5)*4-1', '6*(5*4)-1', '6*5*(4-1)', '(6*5)*(4-1)', '((6*5)*4)-1', '(6*(5*4))-1', '6*((5*4)-1)', '6*(5*(4-1))'] ['(6*5)*4*1', '6*(5*4)*1', '6*5*(4*1)', '(6*5)*(4*1)', '((6*5)*4)*1', '(6*(5*4))*1', '6*((5*4)*1)', '6*(5*(4*1))'] ['(6*5)*4/1', '6*(5*4)/1', '6*5*(4/1)', '(6*5)*(4/1)', '((6*5)*4)/1', '(6*(5*4))/1', '6*((5*4)/1)', '6*(5*(4/1))'] ['(6*5)/4+1', '6*(5/4)+1', '6*5/(4+1)', '(6*5)/(4+1)', '((6*5)/4)+1', '(6*(5/4))+1', '6*((5/4)+1)', '6*(5/(4+1))'] ['(6*5)/4-1', '6*(5/4)-1', '6*5/(4-1)', '(6*5)/(4-1)', '((6*5)/4)-1', '(6*(5/4))-1', '6*((5/4)-1)', '6*(5/(4-1))'] ['(6*5)/4*1', '6*(5/4)*1', '6*5/(4*1)', '(6*5)/(4*1)', '((6*5)/4)*1', '(6*(5/4))*1', '6*((5/4)*1)', '6*(5/(4*1))'] ['(6*5)/4/1', '6*(5/4)/1', '6*5/(4/1)', '(6*5)/(4/1)', '((6*5)/4)/1', '(6*(5/4))/1', '6*((5/4)/1)', '6*(5/(4/1))'] ['(6/5)+4+1', '6/(5+4)+1', '6/5+(4+1)', '(6/5)+(4+1)', '((6/5)+4)+1', '(6/(5+4))+1', '6/((5+4)+1)', '6/(5+(4+1))'] ['(6/5)+4-1', '6/(5+4)-1', '6/5+(4-1)', '(6/5)+(4-1)', '((6/5)+4)-1', '(6/(5+4))-1', '6/((5+4)-1)', '6/(5+(4-1))'] ['(6/5)+4*1', '6/(5+4)*1', '6/5+(4*1)', '(6/5)+(4*1)', '((6/5)+4)*1', '(6/(5+4))*1', '6/((5+4)*1)', '6/(5+(4*1))'] ['(6/5)+4/1', '6/(5+4)/1', '6/5+(4/1)', '(6/5)+(4/1)', '((6/5)+4)/1', '(6/(5+4))/1', '6/((5+4)/1)', '6/(5+(4/1))'] ['(6/5)-4+1', '6/(5-4)+1', '6/5-(4+1)', '(6/5)-(4+1)', '((6/5)-4)+1', '(6/(5-4))+1', '6/((5-4)+1)', '6/(5-(4+1))'] ['(6/5)-4-1', '6/(5-4)-1', '6/5-(4-1)', '(6/5)-(4-1)', '((6/5)-4)-1', '(6/(5-4))-1', '6/((5-4)-1)', '6/(5-(4-1))'] ['(6/5)-4*1', '6/(5-4)*1', '6/5-(4*1)', '(6/5)-(4*1)', '((6/5)-4)*1', '(6/(5-4))*1', '6/((5-4)*1)', '6/(5-(4*1))'] ['(6/5)-4/1', '6/(5-4)/1', '6/5-(4/1)', '(6/5)-(4/1)', '((6/5)-4)/1', '(6/(5-4))/1', '6/((5-4)/1)', '6/(5-(4/1))'] ['(6/5)*4+1', '6/(5*4)+1', '6/5*(4+1)', '(6/5)*(4+1)', '((6/5)*4)+1', '(6/(5*4))+1', '6/((5*4)+1)', '6/(5*(4+1))'] ['(6/5)*4-1', '6/(5*4)-1', '6/5*(4-1)', '(6/5)*(4-1)', '((6/5)*4)-1', '(6/(5*4))-1', '6/((5*4)-1)', '6/(5*(4-1))'] ['(6/5)*4*1', '6/(5*4)*1', '6/5*(4*1)', '(6/5)*(4*1)', '((6/5)*4)*1', '(6/(5*4))*1', '6/((5*4)*1)', '6/(5*(4*1))'] ['(6/5)*4/1', '6/(5*4)/1', '6/5*(4/1)', '(6/5)*(4/1)', '((6/5)*4)/1', '(6/(5*4))/1', '6/((5*4)/1)', '6/(5*(4/1))'] ['(6/5)/4+1', '6/(5/4)+1', '6/5/(4+1)', '(6/5)/(4+1)', '((6/5)/4)+1', '(6/(5/4))+1', '6/((5/4)+1)', '6/(5/(4+1))'] ['(6/5)/4-1', '6/(5/4)-1', '6/5/(4-1)', '(6/5)/(4-1)', '((6/5)/4)-1', '(6/(5/4))-1', '6/((5/4)-1)', '6/(5/(4-1))'] 24点结果 = 6/((5/4)-1) """