当前位置: 首页 > article >正文

枚举法计算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种方法
            #带括号的意思是三个运算符的优先运算组成方式有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))





总结:

1、了解了枚举算法注意事项

    ​在列举的过程中,既不能遗漏也不要重复。

2、明晰了枚举算法的核心

    ​itertools.permutations将输入的可迭代对象即四个数字进行所有可能的全排列;

for num in itertools.permutations(cards):#提取数字并排列

    ​itertools.product将设定好的List1即四个运算符中提取三个与repeat=3相对应;

for ops in itertools.product("+-*/", repeat=3):#提取运算符

    ​将提取的数字排列与运算符依次放入八种可能的优先运算方式中,如果可以满足24点游戏的规则那么输出结果,如果8种运算方式都无法成功得出结果那么就返回”not fond“。

3、学习了4个数字三个运算符的优先排列方式

    ​共有八种:

    ​(ab)cd、a(bc)d、ab(cd)、(ab)(cd)、((ab)c)d、(a(bc))d、a((bc)d)、a(b(cd))。

4、运算结果

输入数字248411261127112824841111
运算结果(2+4)*(8-4)((1+1)+2)*6(1+2)*(1+7)(1+(1*2))*8(2+4)*(8-4)not fond


http://www.kler.cn/a/16611.html

相关文章:

  • Linux git-bash配置
  • 什么时候需要复写hashcode()和compartTo方法
  • 【学习】Fine-tuning知识汇总
  • [CKS] K8S NetworkPolicy Set Up
  • 【练习案例】30个 CSS Javascript 加载器动画效果
  • Unity3D实现视频和模型融合效果
  • C++Primer第五版【阅读笔记】
  • LeetCode 560. 和为 K 的子数组
  • kettle不同数据源的字段不一致的合并后插入数据库
  • 如何使用快速排序算法对整数数组进行就地排序?
  • 从4k到42k,软件测试工程师的涨薪史,给我看哭了
  • 我的医学预测模型评价步骤(仅供参考)
  • SmartEngine流程引擎之Custom模式
  • ApplicationContextAware接口
  • ETL工具 - Kettle 输入输出算子介绍
  • MyBatisPlus代码生成器使用
  • Linux Ansible角色介绍
  • Python使用AI animegan2-pytorch制作属于你的漫画头像/风景图片
  • 3.3 泰勒公式例题分析
  • c++ 11标准模板(STL) std::vector (三)
  • 同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战
  • 抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言
  • ASIC-WORLD Verilog(6)运算符
  • 【.net core 自动生成数据库】
  • 认识Cookie和Session
  • 【算法】求最短路径算法