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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】