题目描述
问题描述
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