题目描述
问题描述
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]))#判断除数是否为0if tmpstr2==0 and op_list[1]=='/':return -1res=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=resif res1<=24 and res1>max_value:max_value=res1return max_value
def dfs(N):#dfs暴力破解 四个数字的排列组合global numsglobal max_valif 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=ndfs(0)print(max_val)max_val=-1