ACDREAM 05C 哗啦啦族的24点游戏(DFS专场)

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 
#include 
#include 
#include 
#include 
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");  
    }  
}

你可能感兴趣的:(====ACM=====)