Python蓝桥杯ALGO-995 24点

题目描述

问题描述
  24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,例如:
  ((A*K)-J)Q等价于((113)-11)*12=24
  加减乘不用多说了,但除法必须满足能整除才能除!这样有一些是得不到24点的,所以这里只要求求出不超过24的最大值。
输入格式
  输入第一行N(1<=N<=5)表示有N组测试数据。每组测试数据输入4行,每行一个整数(1到13)表示牌值。
输出格式
  每组测试数据输出一个整数,表示所能得到的最大的不超过24的值。
样例输入
3
3
3
3
3
1
1
1
1
12
5
13
1
样例输出
24
4
21

思路分析

这个题做的不舒服,就是暴力破解,有更好的方法欢迎大佬指教哦~~~

代码如下

写的很冗余感觉,,,

op_list=['+','-','*','/']
def caculate1(op_list,num_list):
    tmpstr=""
    res=num_list[0]
    for i in range(3):
        tmpstr=str(res)+op_list[i]+str(num_list[i+1])
        res=eval(tmpstr)
    #判断是否是小数
    if int(res)-res==0:
        return int(res)
    return -1
def caculate2(op_list,num_list):
    tmpstr=""
    tmpstr1=eval(str(num_list[0])+op_list[0]+str(num_list[1]))
    tmpstr2=eval(str(num_list[2])+op_list[2]+str(num_list[3]))
    #判断除数是否为0
    if tmpstr2==0 and op_list[1]=='/':
        return -1
    res=eval(str(tmpstr1)+op_list[1]+str(tmpstr2))
     #判断是否是小数
    if int(res)-res==0:
        return int(res)
    return -1
def f(nums):
    max_value=-1
    #三层循环暴力破解 三种运算符的所有可能
    for i in range(4):
        for j in range(4):
            for k in range(4):
                tmp_op=[op_list[i],op_list[j],op_list[k]]
                #括号优先级 四个数字三个运算符就两种优先级
                #1.从左至右
                res=caculate1(tmp_op,nums)
                #2.先算两边在算中间
                res1=caculate2(tmp_op,nums)
#                 print(op_list[i],op_list[j],op_list[k],res,max_value,res<=24,res>max_value,int(res)-res)
                #这里代码写的有点冗余懒得改了
                if res<=24 and res>max_value:
                    max_value=res
                if res1<=24 and res1>max_value:
                    max_value=res1
    return max_value
def dfs(N):#dfs暴力破解 四个数字的排列组合
    global nums
    global max_val
    if N==3:
#         print(nums)
        max_val=max(max_val,f(nums))
    for i in range(N,4):
        nums[i],nums[N]=nums[N],nums[i]
        dfs(N+1)
        nums[i],nums[N]=nums[N],nums[i]
    
            
    
N=int(input())
tmp=[]
num=[]
for j in range(N):
    for i in range(4):
        e=int(input())
        tmp.append(e)
    num.append(tmp)
    tmp=[]
max_val=-1
for n in num:
    nums=n
    dfs(0)
    print(max_val)
    max_val=-1
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值