1.Python算法之枚举算法

本文详细介绍了枚举算法的概念及其在24点游戏中的应用。通过Python代码展示了如何利用全排列和笛卡尔积计算可能的运算组合,找出能够得出24的表达式。虽然枚举算法在处理复杂问题时可能效率较低,但对于解决24点这类特定问题,它提供了一种系统化的求解策略。
摘要由CSDN通过智能技术生成

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)

"""

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值