笔试题(八):计算24点游戏

该代码实现了一个解决24点游戏的算法,通过递归遍历所有可能的数字组合和运算符排列,检查是否能得到24。输入是四个1到10的整数,可以重复,运算符包括加、减、乘、实数除法,每个数字仅使用一次。程序会尝试所有可能的计算方法并返回是否能找到得到24的运算序列。
摘要由CSDN通过智能技术生成
# 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,
# 本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
# 此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
# 输入描述:
# 读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
# 输出描述:
# 对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
import itertools


def num_arrange(wait_num_list, num_used_list):
    if len(wait_num_list) == 1:  # 跳出条件: 只剩一个元素时
        # 打印当前结果
        res.append(num_used_list + [wait_num_list[0]])
        return
    # 依次挑选一个元素作为第1元素
    for i, e in enumerate(wait_num_list):
        # 递归调用自身,同时传入当前的前缀字符串
        num_arrange(wait_num_list[:i] + wait_num_list[i + 1:], num_used_list + [e])


def operate(a, b, symbol):
    if symbol == "+":
        return a+b
    elif symbol == "-":
        return a-b
    elif symbol == "*":
        return a*b
    elif symbol == "/":
        if abs(b) <= 10**(-6):
            return 10**6
        else:
            return a/b


def get_result():
    for i in range(len(res)):
        for j in range(len(res_symbol)):
            temp = res[i]
            symbol = list(res_symbol[j])
            symbol_a = list(set(itertools.permutations(symbol, 3)))
            for k in range(len(symbol_a)):
                temp2 = symbol_a[k]
                result = operate(temp[0], temp[1], temp2[0])
                result = operate(result, temp[2], temp2[1])
                result1 = operate(result, temp[3], temp2[2])

                result01 = operate(temp[1], temp[2], temp2[1])
                result02 = operate(temp[0], result01, temp2[0])
                result2 = operate(result02, temp[3], temp2[2])

                result11 = operate(temp[0], temp[1], temp2[0])
                result12 = operate(temp[2], temp[3], temp2[2])
                result3 = operate(result11, result12, temp2[1])
                if result1 == result2 == result3:
                    cal_result.append(result1)
                elif result1 == result2 or result2 == result3:
                    cal_result.append(result1)
                    cal_result.append(result3)
                elif result1 == result3:
                    cal_result.append(result1)
                    cal_result.append(result2)
                else:
                    cal_result.append(result1)
                    cal_result.append(result2)
                    cal_result.append(result3)
                if result1 == 24 or result2 == 24 or result3 == 24:
                    method = str(temp[0])+temp2[0]+str(temp[1])+temp2[1]+str(temp[2])+temp2[2]+str(temp[3])
                    print("calculate method: ", method)
                    return True
    return False


if __name__ == '__main__':
    num_list = [7, 2, 1, 10]
    res = []
    num_arrange(num_list, [])
    symbol_list = ["+", "-", "*", "/"]
    res_symbol = list(itertools.combinations_with_replacement(symbol_list, 3))
    cal_result = []
    print(get_result())




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Trisyp

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

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

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

打赏作者

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

抵扣说明:

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

余额充值