题目: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     }
原文地址:https://www.cnblogs.com/noip/p/2636879.html