您的位置:首页 > 其它

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”。

样例输入

2

5 5 5 1

9 9 9 9

样例输出

Yes

No

题解

枚举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 dfs