题目链接
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; } }