题目:24点
题目描述
superwyh是一个非常疯狂的24点爱好者,空闲时总是自己拿出扑克来算24点,24点的规则很简单,就是给你4张扑克(从1至13,用A代替1,J代替11,Q代替12,K代替13)通过加减乘除来求得24,各位oier帮了superwyh好多忙,为了报答大家superwyh就和大家做个24点的游戏,superwyh给大家4张牌大家告诉superwyh能不能凑成24就行。
[renqing PS:这道题很easy,是送分的题]
输入格式
4张牌的牌面(1<=n<=13)。
输出格式
如果能凑成输出"yes"反之输出"no"。
因为 ((x_y)_z)_w 可表示这4个数的任意组合运算情况。
所以我们需要枚举出每个数的出场顺序。
第一个数一定是正数,+和*具有对称性,/和-没有对称性,所以不光要考虑(x_y)-z也要考虑z-(x_y).
要避免search()时使开头的数为零,否则4个数就会被消化掉。
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 5 double b[5]; 6 bool p=0,use[5]={0}; 7 string tool=" A234567890JQK"; 8 9 bool Search(int deep,double sum){ 10 if(deep==4) {if(sum<24+0.00001&&sum>24-0.00001) return 1;return 0;} 11 12 for(int i=1;i<=4;++i) 13 if(!use[i]) 14 { 15 use[i]=1; 16 if(Search(deep+1,sum+b[i])) return 1; 17 if(Search(deep+1,sum-b[i])) return 1; 18 if(Search(deep+1,b[i]-sum)) return 1; 19 if(Search(deep+1,sum*b[i])) return 1; 20 if(b[i]!=0&&Search(deep+1,sum/b[i])) return 1; 21 if(sum!=0&&Search(deep+1,b[i]/sum)) return 1; 22 use[i]=0; 23 } 24 return 0; 25 } 26 27 int main() 28 { 29 string s;char a; 30 for(int i=1;i<=4;i++) 31 { 32 cin>>s; 33 if(s=="10") a='0'; 34 else a=s[0]; 35 for(int j=1;j<tool.size();++j) 36 if(tool[j]==a) b[i]=j; 37 if(a=='1') b[i]=1; 38 } 39 40 for(int i=1;i<=4;++i) 41 { 42 use[i]=1; 43 if(Search(1,b[i])) {cout<<"yes"<<endl;return 0;} 44 use[i]=0; 45 } 46 47 cout<<"no"<<endl; 48 49 return 0; 50 }