题解 | 24点运算

## 总体思路:排列组合
## 4个数字 + 3个运算符,构成表达式
## 4个数字全排列共24中情况,4个运算符实际上有3个参与计算,几何分布共64中情况


# 全排列,用递归实现
# lst:数字的列表
# temp:临时数据的列表。是一维的
# res:保存结果的列表。是二维度的
# 来源于AI搜索:用python程序实现对4个数字的全排列
def permute(lst, temp=[], res=[]):
    if len(lst) == 0:
        res.append(temp)
    else:
        for i in range(len(lst)):
            permute(lst[:i] + lst[i + 1 :], temp + [lst[i]], res)


# 得到运算符的所有排列组合
# flag:运算符的列表,一维的。
# flagMatrix:运算符的所有排列组合,二维的
def total(flag, flagMatrix):
    for i in flag:
        for j in flag:
            for k in flag:
                temp = [i, j, k]
                flagMatrix.append(temp)
                temp = []


# 符号转数字
def get_digit(char):
    if char == "J":
        return 11
    elif char == "Q":
        return 12
    elif char == "K":
        return 13
    elif char == "A":
        return 1
    else:
        return int(char)


# 拼接出完整的表达式
# num:数字的列表
# flag:运算符的列表
def get_full_expression(num, flag):
    exp = ""
    exp += num[0]  # 第一个数据先取出来,作为左边操作数
    i = 1
    while i <= 3:  # 取3个数据、2个运算符
        operation = flag[i-1]
        exp += operation  # 拼接运算符
        rightNum = num[i]
        exp += rightNum  # 拼接右边操作数
        i += 1
    return exp


# 计算表达式的值
# num:数字的列表
# flag:运算符的列表
def get_value(num, flag):
    full = get_full_expression(num, flag)
    express = str(get_digit(num[0]))  # 第一个数据先取出来
    result = 0
    for i in range(1, 4):         # 取第1-3个数字、运算符,成对拼接. # 循环计算a+b
        operation = flag[i-1]
        express += operation     # 拼接运算符
        rightNum = str(get_digit(num[i]))
        express += rightNum      # 拼接右边操作数
        result = eval(express)   # 得到a+b形式的express时,马上计算1次运算结果
        express = str(result)    # 将结果作为新的a,循环计算。
    # print("full={},result={}".format(full,result))
    if result == 24:
        return (24, full)
    else:
        return (-1, "NONE")


while True:
    try:
        num = input().split()
        temp, numMatrix = [], []
        permute(num, temp, numMatrix)  ## 4个数全排列共4!(24)种,得到矩阵24*4
        # print("numMatrix={}".format(numMatrix))

        flag = ["+", "-", "*", "/"]
        flagMatrix = []
        total(flag, flagMatrix)  ## 4个符号中的3个组成运算符,不是全排列,而是4*4*4=64种
        # print("flagMatrix={}".format(flagMatrix))

        if "joker" in num or "JOKER" in num:
            print("ERROR")
        else:
            expression = []
            ans = ""
            response = []
            for numRow in numMatrix:  # 取每一组数字,共24次,一组4个,参与运算
                for flagRow in flagMatrix:  # 取每一组运算符,共64组,一组3个
                    response = get_value(numRow, flagRow)  # 返回值包含拼接结果、计算结果
                    if response[0] == 24:
                        break

                if response[0] == 24:
                    break

            for i in response[1]:  # 输出
                print(i, end="")
    except:
        break

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务