ACDREAM 05C 哗啦啦族的24点游戏
Problem Description
哗啦啦族的小Q是一个狂热的24点爱好者,24点就是给你一串数字,问你是否通过加减乘除括号构成24点。
唐老师也觉得这个很好玩,就决定考考小q,给你4个数,你用加减乘除和括号,是否能构成24点呢?
Input
第一行t,表示有多少组测试数据,1<=t<=50
接下来t行,每行4个数字,表示每个数都是多少,1<=a[i]<=13
Output
对于每一次询问,如果能够凑成24点,输出yes,否则输出no
Sample Input
2
3 3 8 8
1 1 1 1
Sample Output
yes
no
Hint
3 3 8 8
就可以构造出 8 ÷ (3 – 8 ÷ 3)=24
题目大意:经典的加减乘除24点。(注意括号)
解题思路:一开始写了6个DFS,没有考虑到两个括号的情况,后来打补丁的时候懒得动脑筋了,就偷懒写了一个很挫的代码。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
int flag;
double num[5];
void DFS(int cnt, double ans) {
if (flag) return;
if (cnt == 4) {
if (fabs(ans - 24) < 1e-7) flag = 1;
return;
}
DFS(cnt + 1, ans + num[cnt]);
DFS(cnt + 1, ans - num[cnt]);
DFS(cnt + 1, num[cnt] - ans);
DFS(cnt + 1, num[cnt] / ans);
DFS(cnt + 1, ans / num[cnt]);
DFS(cnt + 1, ans * num[cnt]);
if (cnt == 2) {
DFS(cnt + 2, ans + (num[cnt] + num[cnt + 1]));
DFS(cnt + 2, ans + (num[cnt] * num[cnt + 1]));
DFS(cnt + 2, ans + (num[cnt] / num[cnt + 1]));
DFS(cnt + 2, ans + (num[cnt + 1] / num[cnt]));
DFS(cnt + 2, ans + (num[cnt] - num[cnt + 1]));
DFS(cnt + 2, ans + (num[cnt + 1] - num[cnt]));
DFS(cnt + 2, ans - (num[cnt] + num[cnt + 1]));
DFS(cnt + 2, ans - (num[cnt] * num[cnt + 1]));
DFS(cnt + 2, ans - (num[cnt] / num[cnt + 1]));
DFS(cnt + 2, ans - (num[cnt + 1] / num[cnt]));
DFS(cnt + 2, ans - (num[cnt] - num[cnt + 1]));
DFS(cnt + 2, ans - (num[cnt + 1] - num[cnt]));
DFS(cnt + 2, ans * (num[cnt] + num[cnt + 1]));
DFS(cnt + 2, ans * (num[cnt] * num[cnt + 1]));
DFS(cnt + 2, ans * (num[cnt] / num[cnt + 1]));
DFS(cnt + 2, ans * (num[cnt + 1] / num[cnt]));
DFS(cnt + 2, ans * (num[cnt] - num[cnt + 1]));
DFS(cnt + 2, ans * (num[cnt + 1] - num[cnt]));
DFS(cnt + 2, ans / (num[cnt] + num[cnt + 1]));
DFS(cnt + 2, ans / (num[cnt] * num[cnt + 1]));
DFS(cnt + 2, ans / (num[cnt] / num[cnt + 1]));
DFS(cnt + 2, ans / (num[cnt + 1] / num[cnt]));
DFS(cnt + 2, ans / (num[cnt] - num[cnt + 1]));
DFS(cnt + 2, ans / (num[cnt + 1] - num[cnt]));
DFS(cnt + 2, (num[cnt] + num[cnt + 1]) - ans);
DFS(cnt + 2, (num[cnt] * num[cnt + 1]) - ans);
DFS(cnt + 2, (num[cnt] / num[cnt + 1]) - ans);
DFS(cnt + 2, (num[cnt + 1] / num[cnt]) - ans);
DFS(cnt + 2, (num[cnt] - num[cnt + 1]) - ans);
DFS(cnt + 2, (num[cnt + 1] - num[cnt]) - ans);
DFS(cnt + 2, (num[cnt] + num[cnt + 1]) / ans);
DFS(cnt + 2, (num[cnt] * num[cnt + 1]) / ans);
DFS(cnt + 2, (num[cnt] / num[cnt + 1]) / ans);
DFS(cnt + 2, (num[cnt + 1] / num[cnt]) / ans);
DFS(cnt + 2, (num[cnt] - num[cnt + 1]) / ans);
DFS(cnt + 2, (num[cnt + 1] - num[cnt]) / ans);
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]);
flag = 0;
sort(num, num + 4);
do { DFS(1, num[0]); } while (next_permutation(num, num + 4));
if (flag) printf("yes\n");
else printf("no\n");
}
}