HDU1427 速算24点【DFS】

速算24点

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6309    Accepted Submission(s): 1621


 

Problem Description

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。

 

Input

每组输入数据占一行,给定四张牌。

 

Output

每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。

 

Sample Input

 

A 2 3 6 3 3 8 8

 

Sample Output

 

Yes No

 

Author

LL

 

Source

ACM暑期集训队练习赛(三)

问题链接HDU1427 速算24点

问题描述

  给4张牌,用算术运算{+,-*,/}进行整数计算,判断其结果是否有可能为24。

问题分析

  暴力是必须的,问题在于怎么实现暴力。

  用DFS实现是一种有效的方法,其中用到递归和回溯。同时也需要用到全排列。

  由于需要考虑计算的优先级,例如计算a*b-c/d和a+b*c-d等,所以DFS函数稍微复杂一些。

程序说明

  使用全排列函数进行计算似乎是需要先排序的!

参考链接:(略)

题记:需要暴力时,考虑一下全排列。

AC的C++语言程序如下:

/* HDU1427 速算24点 */

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>

using namespace std;

const int N = 4;
int a[N];
bool flag;

bool dfs(int cnt, int result1, int result2)
{
    if(cnt == N - 1) {
        if(result1 + result2 == 24 || result1 - result2 == 24 || result1 * result2 == 24)
            flag = true;
        if(result2 != 0 && result1 % result2 == 0 && result1 / result2 == 24)
            flag = true;
    } else if(!flag) {
        // 先算前2项
        dfs(cnt + 1, result1 + result2, a[cnt + 1]);
        dfs(cnt + 1, result1 - result2, a[cnt + 1]);
        dfs(cnt + 1, result1 * result2, a[cnt + 1]);
        if(result2 != 0 && result1 % result2 == 0)
            dfs(cnt + 1, result1 / result2, a[cnt + 1]);

        // 先算后2项,相当与后2项计算是加括号的
        dfs(cnt + 1, result1, result2 + a[cnt + 1]);
        dfs(cnt + 1, result1, result2 - a[cnt + 1]);
        dfs(cnt + 1, result1, result2 * a[cnt + 1]);
        if(a[cnt + 1] != 0 && result2 % a[cnt + 1] == 0)
            dfs(cnt + 1, result1, result2 / a[cnt + 1]);
    }
    return false;
}

int main()
{
    for(; ;) {
        char s[4];
        for(int i = 0; i < N; i++) {
            if(scanf("%s", s) == EOF)
                return 0;
            if(strlen(s) == 2)
                a[i] = 10;
            else if(s[0] == 'A')
                a[i] = 1;
            else if(s[0] == 'J')
                a[i] = 11;
            else if(s[0] == 'Q')
                a[i] = 12;
            else if(s[0] == 'K')
                a[i] = 13;
            else
                a[i] = s[0] - '0';
        }

        sort(a, a + N);
        flag = false;
        do {
            dfs(1, a[0], a[1]);
            if(flag)
                break;
        } while(next_permutation(a, a + N));

        printf("%s\n", flag ? "Yes" : "No");
    }

    return 0;
}


猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/81905291