hihoCoder--1304 搜索一·24点
2017-04-07 21:06
405 查看
描述
周末,小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”。样例输入
25 5 5 1
9 9 9 9
样例输出
YesNo
题解
枚举a, b, c, d每一种排列,再枚举三种运算,根据提示,如果增加反-和
反/两种操作(很妙的思路),所有的计算过程只有两种:
1.
(((a @ b) @ c) @ d)
2.
(a @ b) @ (c @ d)
#include <bits/stdc++.h> using namespace std; double nums[4]; // a, b, c, d double number[4]; bool used[4]; int opType[6]; // +, - , * , /, 反-, 反/ int ops[3]; int t; double f(double a, double b, int op){ double ret = 0; switch (op){ case 0: ret = a + b; break; case 1: ret = a - b; break; case 2: ret = a * b; break; case 3: if(b != 0) ret = a / b; break; case 4: ret = b - a; break; case 5: if(a != 0) ret = b / a; break; } return ret; } int calc(){ // (((a @ b) @ c) @ d) if(f(f(f(nums[0], nums[1], ops[0]), nums[2], ops[1]), nums[3], ops[2]) == 24) return true; // (a @ b) @ (c @ d) if(f(f(nums[0], nums[1], ops[0]), f(nums[2], nums[3], ops[2]), ops[1]) == 24) return true; return false; } int calc(int i, int j, int k){ // (((a @ b) @ c) @ d) if(f(f(f(nums[0], nums[1], i), nums[2], j), nums[3], k) == 24) return true; // (a @ b) @ (c @ d) if(f(f(nums[0], nums[1], i), f(nums[2], nums[3], k), j) == 24) return true; return false; } bool dfs(int cur){ if(cur >= 3){ if(calc()) return true; else return false; } for(int i = 0; i < 6; ++i){ ops[cur] = i; if(dfs(cur + 1)) return true; } return false; } bool judge(){ for(int i = 0; i < 6; ++i){ for(int j = 0; j < 6; ++j){ for(int k = 0; k < 6; ++k){ if(calc(i, j, k)) return true; } } } return false; } bool makeNumber(int cur){ if(cur >= 4) return dfs(0); for(int i = 0; i < 4; ++i){ if(!used[i]){ nums[cur] = number[i]; used[i] = true; if(makeNumber(cur + 1)) return true; used[i] = false; } } return false; } int main(){ #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); #endif // ONLINE_JUDGE cin >> t; while(t--){ for(int i = 0; i < 4; ++i) cin >> number[i]; memset(used, 0, sizeof(used)); if(makeNumber(0)) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
相关文章推荐
- 【hihocoder 1304】搜索一·24点
- hihocoder 1304 : 搜索一·24点(DFS+回溯)
- hihocoder 1304 : 搜索一·24点
- hihoCoder搜索专题1---24点
- hihocoder 九十八周 搜索一 24点
- hihoCoder 搜索一·24点
- hihoCoder 搜索一·24点
- Hihocoder第九十八周 搜索一·24点
- 【hihocoder 1317】搜索四·跳舞链
- 24点小游戏利用深度搜索设计
- hihocoder 1050 树中的最长路(动态规划,dfs搜索)
- #1304 : 搜索一·24点
- 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
- hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
- hiho一下 第九十八周 题目1 : 搜索一·24点
- 【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
- hihoCoder1041—国庆出游(搜索好题)
- 【hihocoder 1308】搜索二·骑士问题
- hiho一下 第九十八周 #1304 : 搜索一·24点 【此方法好巧妙呀---用来求24点】
- hihoCoder搜索二·骑士问题