资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,例如:
((A*K)-J)*Q等价于((1*13)-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
思路:暴力搜索,注意点的是比如拿出两个数,a[i]和a[j],运算a[i]-a[j]就不用再运算a[j]-a[i]了,因为我拿取数的顺序不定,可能先拿取a[j],再拿取a[i],所以不用考虑交换律什么的。
#include<bits/stdc++.h>
using namespace std;
int a[4];
bool isUse[4];
int maxNumber=-0x3f3f3f3f;
void search(int num) {//num为已经选择了num个数
//选出一个数进行运算
if(num==3) {
for(int i=0; i<4; i++) {
if(!isUse[i]&&a[i]<=24) {
maxNumber=max(a[i],maxNumber);
break;
}
}
return;
}
for(int i=0; i<4; i++) {
if(!isUse[i]) {
isUse[i]=true;
for(int j=0; j<4; j++) {//随即拿取两个数,顺序不定
if(!isUse[j]) {
int temp=a[j];
a[j]=a[i]+a[j];
//两数运算结果存在a[j]中,a[j]不用标记为已经访问过,因为我下一次还要用
search(num+1);
a[j]=temp;//恢复现场
a[j]=a[i]-a[j];
search(num+1);
a[j]=temp;//恢复现场
a[j]=a[i]*a[j];
search(num+1);
a[j]=temp;
if(a[i]!=0&&a[j]%a[i]==0) {
a[j]=a[j]/a[i];
search(num+1);
a[j]=temp;
}
}
}
isUse[i]=false;
}
}
}
int main() {
int n;
cin>>n;
while(cin>>a[0]>>a[1]>>a[2]>>a[3]) {
memset(isUse,0,sizeof(isUse));
search(0);
cout<<maxNumber<<endl;
maxNumber=-0x3f3f3f3f;
}
return 0;
}