TZOJ1344速算24点
具体题目
题解
将纸牌的数值用数组记录,有括号改变运算顺序,所以先将数组从小到大排序然后全排列,分两种情况((a@b)@c)d和(a@b)@(c@d)用dfs暴力搜索
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string a[10];
int b[10],v[10];
int flag;
void dfs(int sum,int p,int x)
{
// cout<<sum<<endl;
if(flag) return;
if(p==3) {
// cout<<x<<endl;
if(sum+x==24) flag=1;
if(sum-x==24) flag=1;
if(sum*x==24) flag=1;
if(x!=0&&sum%x==0&&sum/x==24) flag=1;
return;
}
//((ab)c)d
dfs(sum+x,p+1,b[p+1]);
dfs(sum-x,p+1,b[p+1]);
dfs(sum*x,p+1,b[p+1]);
if(x!=0&&sum%x==0)
dfs(sum/x,p+1,b[p+1]);
//(ab)(cd)
dfs(sum,p+1,x+b[p+1]);
dfs(sum,p+1,x-b[p+1]);
dfs(sum,p+1,x*b[p+1]);
if(x%b[p+1]==0)
dfs(sum,p+1,x/b[p+1]);
}
int main()
{
while(cin>>a[0]>>a[1]>>a[2]>>a[3])
{
flag=0;
for(int i=0;i<4;i++) {
if(a[i].size()==2) {
b[i]=10;
} else {
if(a[i]=="A") b[i]=1;
else if(a[i]=="J") b[i]=11;
else if(a[i]=="Q") b[i]=12;
else if(a[i]=="K") b[i]=13;
else b[i]=a[i][0]-'0';
}
}
sort(b,b+4);
//全排列各种情况
do{
// for(int i=0;i<4;i++) cout<<b[i]<<" ";
// cout<<endl;
dfs(b[0],1,b[1]);
}while(next_permutation(b,b+4)&&!flag);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
// system("pause");
return 0;
}