雷昂纳多·梅西 2021-07-02 14:03 采纳率: 75%
浏览 89
已采纳

python用扑克牌计算24点

一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。

输入格式:
输入在一行中给出 4 个整数,每个整数取值在 [1, 13]。

输出格式:
输出任一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出 -1。

输入样例:
2 3 12 12
输出样例:
((3-2)*12)+12

  • 写回答

1条回答 默认 最新

  • Roc-xb 后端领域优质创作者 2021-07-02 15:24
    关注
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    """
    @author: YangPC
    @time:2021/07/02
    @QQ:327844761
    @微信公众号:ewbang
    """
    
    # 二十四点
    import os
    from time import sleep
    from time import perf_counter
    import random
    
    global Goal
    Goal = 24
    
    
    # 得到四个用户输入值
    def getNumbers():
        a = int(input("请输入第1个值:"))
        b = int(input("请输入第2个值:"))
        c = int(input("请输入第3个值:"))
        d = int(input("请输入第4个值:"))
        print(f"输入的数值为:{a},{b},{c},{d}")
        return f"{a} {b} {c} {d}"
    
    
    # 穷举所有的数值列表
    # 共4!=24种
    def getNumList(numbers):
        items = numbers.split()
        data_list = [(items[i] + ' ' + items[j] + ' ' + items[p] + ' ' + items[q]) for i in range(4) for j in range(4) for p
                     in range(4) for q in range(4) if (i != j) & (i != p) & (i != q) & (j != p) & (j != q) & (p != q)]
        # 使用set方法排除冗余的数字组合
        # 当输入的数字中存在重复数字,则4!=24种排序方案会存在重复,必须排除
        return set(data_list)
    
    
    # 穷举所有的操作符列表
    # 共4x4x4=64种
    def getOplist(ops):
        op_list = [ops[i] + ' ' + ops[j] + ' ' + ops[p] for i in range(4) for j in range(4) for p in range(4)]
        return op_list
    
    
    # 计算24点
    def Cal(num_list, opt_list):
        res = []
        for numlist in num_list:
            nums = numlist.split()
            for oplist in opt_list:
                ops = oplist.split()
                Cal24(res, nums, ops)
        return random.choice(res) if len(res) > 0 else -1
    
    
    # 对单种运算符顺序和单种数字顺序进行组合运算
    def Cal24(res, nums, op):
        global Goal
        # 第一种情况 ((num0 op0 num1)op1 num2)op2 num3
        try:
            if round(eval("((" + nums[0] + op[0] + nums[1] + ")" + op[1] + nums[2] + ")" + op[2] + nums[3]), 0) == Goal:
                res.append("(({}{}{}){}{}){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
        except:
            pass
        # 第二种情况 (num0 op0 num1) op1 (num2 op2 num3)
        try:
            if round(eval("(" + nums[0] + op[0] + nums[1] + ")" + op[1] + "(" + nums[2] + op[2] + nums[3] + ")"),
                     0) == Goal:
                res.append("({}{}{}){}({}{}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
        except:
            pass
        # 第三种情况 ( num0 op0 ( num1 op1 num2 )) op2 num3
        try:
            if round(eval("(" + nums[0] + op[0] + "(" + nums[1] + op[1] + nums[2] + "))" + op[2] + nums[3]), 0) == Goal:
                res.append("({}{}({}{}{})){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
        except:
            pass
        # 第四种情况 num0 op0 (( num1 op1 num2 ) op2 num3 )
        try:
            if round(eval(nums[0] + op[0] + "((" + nums[1] + op[1] + nums[2] + ")" + op[2] + nums[3] + ")"), 0) == Goal:
                res.append("{}{}(({}{}{}){}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
        except:
            pass
        # 第五种情况 num0 op0 ( num1 op1 ( num2 op2 num3 ))
        try:
            if round(eval(nums[0] + op[0] + "(" + nums[1] + op[1] + "(" + nums[2] + op[2] + nums[3] + "))"), 0) == Goal:
                res.append("{}{}({}{}({}{}{}))={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
        except:
            pass
    
    
    if __name__ == '__main__':
        numbers = getNumbers()
        start = perf_counter()
        num_list = getNumList(numbers)
        opt_list = getOplist('+-*/')
        res = Cal(num_list, opt_list)
        print(f"输出结果:{res}")
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败