题目1 : 搜索一·24点
描述
周末,小Hi和小Ho都在家待着。
在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。
小Ho:玩点什么好呢?
小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。
小Ho:好啊,好啊。
<经过若干局游戏之后>
小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?
小Hi:让我想想。
<过了几分钟>
小Hi:我知道了!其实很简单嘛。
输入
第1行:1个正整数, t,表示数据组数,2≤t≤100。
第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。
输出
第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。
- 样例输入
-
2 5 5 5 1 9 9 9 9
- 样例输出
-
Yes No
思路:简单的dfs,但是要用浮点;#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 1000000007 #define inf 999999999 #define esp 0.00000000001 //#pragma comment(linker, "/STACK:102400000,102400000") int scan() { int res = 0 , ch ; while( !( ( ch = getchar() ) >= '0' && ch <= '9' ) ) { if( ch == EOF ) return 1 << 30 ; } res = ch - '0' ; while( ( ch = getchar() ) >= '0' && ch <= '9' ) res = res * 10 + ( ch - '0' ) ; return res ; } double a[5],ans; void dfs(double num,double gg,int step) { if(step==4) { if(num==24) ans=1; return; } //不加括号 dfs(num+gg,a[step+1],step+1); dfs(num-gg,a[step+1],step+1); dfs(num*gg,a[step+1],step+1); if(gg!=0) dfs(num/gg,a[step+1],step+1); //加括号 if(step!=3) { dfs(num,gg+a[step+1],step+1); dfs(num,gg*a[step+1],step+1); dfs(num,gg-a[step+1],step+1); if(a[step+1]!=0) dfs(num,gg/a[step+1],step+1); } } int main() { int x,y,z,i,t; scanf("%d",&x); while(x--) { ans=0; for(i=0;i<4;i++) scanf("%lf",&a[i]); sort(a,a+4); do { dfs(a[0],a[1],1); } while(next_permutation(a,a+4)); if(ans) printf("Yes\n"); else printf("No\n"); } return 0; }