【rqnoj 74】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”。 

样例输入

A 2 3 4

输出

yes

DP会Wa,就不粘代码了。

搜索AC

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 string s;int a[5];
 7 bool used[5];
 8 bool dfs(int dep,double sum){
 9     if(dep==4){
10         if(sum>23.999999&&sum<24.000001) return true;
11         else return false;
12     }
13     else{
14         for(int i=0;i<4;i++){
15             if(!used[i]){
16                 used[i]=1;
17                 if(dfs(dep+1,sum+a[i])) return true;
18                 if(dfs(dep+1,sum-a[i])) return true;
19                 if(dfs(dep+1,a[i]-sum)) return true;
20                 if(sum!=0&&dfs(dep+1,sum*a[i])) return true;
21                 if(sum!=0&&dfs(dep+1,sum/a[i])) return true;
22                 if(sum!=0&&dfs(dep+1,a[i]/sum)) return true;
23                 used[i]=0;
24             }
25         }
26         return false;
27     }
28 }
29 int main(){
30     for(int i=0;i<4;i++){
31         cin>>s;
32         if(s[0]=='A') a[i]=1;
33         else if(s[0]=='J') a[i]=11;
34         else if(s[0]=='Q') a[i]=12;
35         else if(s[0]=='K') a[i]=13;
36         else if(s[0]=='1'&&s[1]=='0') a[i]=10;
37         else a[i]=s[0]-'0';
38     }
39     if(dfs(0,0)) printf("yes\n");
40     else printf("no\n");
41     return 0;
42 }
posted @ 2017-10-15 22:08  Emine  阅读(289)  评论(0编辑  收藏  举报