题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1427
解题思路
看到题一脸懵,这直接枚举吗?
居然是dfs!
大佬题解
之所以,我没写题解,是因为我觉得自己的理解也不是很透彻。
AC代码
#include<bits/stdc++.h>
using namespace std;
int flag=0;
int card[5];
char s[3];
void convert(int i){
if(s[0]=='A') card[i]=1;
else if(s[0]=='J') card[i]=11;
else if(s[0]=='Q') card[i]=12;
else if(s[0]=='K') card[i]=13;
else if(s[0]=='1'&&s[1]=='0') card[i]=10;//容易忘!!!
else card[i]=s[0]-'0';
}
void dfs(int sum,int step,int tmp){
if(flag) return ;
if(step==4){//结束前要将前半段与后半段拼接
if(sum+tmp==24 || sum-tmp==24 || sum*tmp==24) flag=1;
if(tmp!=0&&sum%tmp==0&&sum/tmp==24) flag=1;
return ;
}
//前后半段拼接
dfs(sum+tmp,step+1,card[step+1]);
dfs(sum-tmp,step+1,card[step+1]);
dfs(sum*tmp,step+1,card[step+1]);
if(tmp!=0&&sum%tmp==0) dfs(sum/tmp,step+1,card[step+1]);
//新数字与后半段拼接
dfs(sum,step+1,tmp+card[step+1]);
dfs(sum,step+1,tmp-card[step+1]);
dfs(sum,step+1,tmp*card[step+1]);
if(tmp%card[step+1]==0) dfs(sum,step+1,tmp/card[step+1]);
}
int main(){
while(cin>>s){
convert(1);
for(int i=2;i<=4;i++){
cin>>s;
convert(i);
}
flag=0;
sort(card+1,card+5);
do{
dfs(card[1],2,card[2]);
}while(next_permutation(card+1,card+5)&&!flag);//全排列
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
京公网安备 11010502036488号