UESTC 1252 24点问题 DFS
2016-08-11 21:19
197 查看
1.问题描述:
24点就是给你一串数字,问你是否通过加减乘除括号构成24点。
沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?
注意哦~这里的除法并不是整数除法,比如样例
Input
第一行TT,表示有多少组测试数据,1≤T≤501≤T≤50接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1≤ai≤131≤ai≤13
Output
对于每一次询问,如果能够凑成2424点,输出yes,否则输出
no
Sample input and output
Sample Input | Sample Output |
---|---|
2 3 3 8 8 1 1 1 1 | yes no |
Hint
33 33 88 88就可以构造出 8÷(3–8÷3)=24
2.算法思路:
我们对于这种题采用暴力搜索就好,本体采用深度优先搜索(DFS)深搜的思路是这样的:
我们采用排列组合的方式,这样想选出来的两个数先进性计算(这个过程相当于我们的加括号限制优先级)
然后知道我们的所有数据数变成1,那就是答案,再用答案与24进行比较,因为我们是一步一步计算的,不会有人脑的对分数进行花间的功能,所以说,因为
除法的存在,我们会先出现小数的情况,对于这种情况,我们最后只要限制小数点点二位数就好,这里面对于题来说,我们限制为1e-2就可以了
3.AC代码:
#include"iostream" #include"cstdio" #include"cstdlib" #include"cmath" using namespace std; double a[10]; bool dfs(int n) { if(n==1) { if(fabs(a[0]-24)<1e-2) return true; else return false; } else { for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { double x=a[i]; double y=a[j]; a[j]=a[n-1]; a[i]=x+y;if(dfs(n-1)) return true; a[i]=x-y;if(dfs(n-1)) return true; a[i]=y-x;if(dfs(n-1)) return true; a[i]=x*y;if(dfs(n-1)) return true; if(x!=0) a[i]=y/x; if(dfs(n-1)) return true; if(y!=0) a[i]=x/y; if(dfs(n-1)) return true; a[i]=x; a[j]=y; } } return false; } } int main() { int t; cin>>t; while(t--) { for(int i=0;i<4;i++) cin>>a[i]; if(dfs(4)) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
相关文章推荐
- UESTC - 1252 24点游戏 (DFS)好题
- UESTC--1252--24点游戏(dfs)
- UESTC--1252--24点游戏(dfs)
- UESTC 1252 24点游戏 DFS
- cdoj 1252 24点游戏 dfs
- 2016 UESTC Training for Search Algorithm & String A - Xiper的奇妙历险(1) 八皇后问题、dfs
- POJ 2251 (三维迷宫问题) DFS /BFS
- poj 1321 棋盘问题 (DFS )
- 今天写dfs时发现到一个需要注意的问题
- POJ 1129 Channel Allocation DFS搜索 着色问题
- 背包问题--POJ 1252 Euro Efficiency【完全背包】
- POJ 1129 Channel Allocation DFS搜索 着色问题
- Sicily 1153 马的周游问题(DFS深度优先搜索)
- POJ 2488 爵士游行问题--DFS遍历
- 指定了多个代码页(1252 和 936)问题
- POJ 1321 棋盘问题(DFS+回溯)
- POJ 2488 A Knight's Journey(DFS——骑士周游问题)
- Arithmetically Challenged 排列树 子集树 24点问题 回溯 关联容器
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- pku 1321 棋盘问题 简单DFS