华为机试题 24点

计算24点

1、描述

       计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), (/)四种运算法则计算得到整数24

本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:

        3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

        本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。

        题目地址牛客网地址

2、解题思路

       暴力法穷举所有的可能的组合(题目只需找到任意满足24点的式子即可)。

       4 x 4 x 3 x 4 x 2 x 4 x 1= 256 x 6 = 1536 (每层需查找4种算符)

      主要难点是7层循环内部的剪枝,即候选的数字的剪枝,内层的数字不要和外层重复

     (抽出来的4张牌可能重复,即牌面的数值会重复,而牌不能重复-对应位置的牌在式子中只出现一次

3、代码

pokers = input().split(" ")

pok_2_digit = {'J': 11, 'Q': 12, 'K': 13, 'A': 1}
digit_2_pok = {pok_2_digit[k]: k for k in pok_2_digit}

digits = []
flag = False
for pok in pokers:
    if len(pok) != 5:
        if pok.isdigit():
            digits.append(int(pok))
        else:
            digits.append(pok_2_digit[pok])
    else:
        flag = True
        break

if flag == True:
    print('ERROR')
else:
    def operate(nums, opers):
        res = nums[0]
        for i in range(len(opers)):
            num = nums[i+1]
            oper = opers[i]
            if oper == '+':
                res += num
            elif oper == '-':
                res -= num
            elif oper == '*':
                res *= num
            elif oper == '/':
                res = res // num
        return res

    def output(res_nums, res_opers):
        nums = []
        for num in res_nums:
            if num in digit_2_pok:
                nums.append(digit_2_pok[num])
            else:
                nums.append(str(num))

        res = [nums[0]]
        for i in range(len(res_opers)):
            res.append(res_opers[i])
            res.append(nums[i+1])
        return "".join(res)

    opers = ['+', '-', '*', '/']
    def check_24(digits, opers):
        n = len(digits)
        for i1 in range(n):
            d1 = digits[i1]
            for o1 in opers:
                for i2 in range(n):
                    if i2 != i1:
                        d2 = digits[i2]
                        for o2 in opers:
                            for i3 in range(n):
                                if i3 != i2 and i3 != i1:
                                    d3 = digits[i3]
                                    for o3 in opers:
                                        for i4 in range(n):
                                            if i4 != i3 and i4 != i2 and i4 != i1:
                                                d4 = digits[i4]
                                                enum_nums = (d1, d2, d3, d4)
                                                enum_opers = (o1, o2, o3)
                                                if operate(enum_nums, enum_opers) == 24:
                                                    return output(enum_nums, enum_opers)
        return None

    result = check_24(digits, opers)
    if result:
        print(result)
    else:
        print('NONE')
原文地址:https://www.cnblogs.com/justLittleStar/p/15002100.html