搜索一·24点---dfs
2016-05-15 14:32
375 查看
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
周末,小Hi和小Ho都在家待着。
在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。
小Ho:玩点什么好呢?
小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。
小Ho:好啊,好啊。
<经过若干局游戏之后>
小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?
小Hi:让我想想。
<过了几分钟>
小Hi:我知道了!其实很简单嘛。
提示:24点
输入
第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
单点时限:1000ms
内存限制:256MB
描述
周末,小Hi和小Ho都在家待着。
在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。
小Ho:玩点什么好呢?
小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。
小Ho:好啊,好啊。
<经过若干局游戏之后>
小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?
小Hi:让我想想。
<过了几分钟>
小Hi:我知道了!其实很简单嘛。
提示:24点
输入
第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
#include "iostream" #include "algorithm" #include "vector" #include "fstream" #include "string.h" using namespace std; int T; double nowNum[4]; int ops[3]; double number[4]; int used[4]; // + - * / 反- 反/ int opType[] = {0, 1, 2, 3, 4, 5}; bool Oper(int depth); double calType1(); double calType2(); bool Num(int depth) { if(depth >= 4) { return Oper(0); } for(int i=0; i<4; i++) { if(!used[i]) { nowNum[depth] = number[i]; used[i] = 1; if(Num(depth+1)) return true; used[i] = 0; } } return false; } bool Oper(int depth) { if(depth >= 3) { if (abs(calType1()-24) < 1e-10) return true; if (abs(calType2()-24) < 1e-10) return true; return false; } for(int i=0; i<6; i++) { ops[depth] = opType[i]; if(Oper(depth+1)) return true; } return false; } //(c @ d) @ e @ f double calType1() { double result = nowNum[0]; for(int i=1; i<4; i++) { if(ops[i-1] == 0) result += nowNum[i]; else if(ops[i-1] == 1) result -= nowNum[i]; else if(ops[i-1] == 2) result *= nowNum[i]; else if(ops[i-1] == 3) result /= nowNum[i]; else if(ops[i-1] == 4) result = nowNum[i] - result; else if(result != 0) result = nowNum[i] / result; else return 0; } return result; } //(c @ d) @ (e @ f) double calType2() { double a[2]; int k = 0; double result; for(int i=0; i<3; i+=2) { if(ops[i] == 0) a[k++] = nowNum[i] + nowNum[i+1]; else if(ops[i] == 1) a[k++] = nowNum[i] - nowNum[i+1]; else if(ops[i] == 2) a[k++] = nowNum[i] * nowNum[i+1]; else if(ops[i] == 3) a[k++] = nowNum[i] / nowNum[i+1]; else if(ops[i] == 4) a[k++] = nowNum[i+1] - nowNum[i]; else a[k++] = nowNum[i+1] / nowNum[i]; } if(ops[1] == 0) result = a[0] + a[1]; else if(ops[1] == 1) result = a[0] - a[1]; else if(ops[1] == 2) result = a[0] * a[1]; else if(ops[1] == 3) if(a[1] != 0) result = a[0] / a[1]; else return 0; else if(ops[1] == 4) result = a[1] - a[0]; else if(a[0] != 0) result = a[1] / a[0]; else return 0; return result; } int main() { cin >> T; while(T--) { for(int i=0; i<4; i++) cin >> number[i]; memset(used, 0, sizeof(used)); if(Num(0)) cout << "Yes"; else cout << "No"; cout << endl; } return 0; }
相关文章推荐
- Intent
- 案例-表的使用
- Metal 着色语言编程指南 二十
- React Native从入门到放弃
- [经验技巧] Android移植中部分重要lib库文件作用
- 算法-快速排序
- PC常用的快捷键
- android中的广播
- Android中XML的三种解析方式
- Poj 2186 Popular Cows
- redis之Hiredis C编程
- Linux:前期总结
- Java中自定义注解的应用
- 关于python文件转为exe文件
- 处理电脑蓝屏步骤
- [架构设计]第一讲:什么是架构
- Git 学习 -- 远程操作
- ntp测试小记
- 剑指offer面试题38:数字在已排序数组中出现的次数
- ReactNative – 组件的生命周期