速算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
问题链接: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;
}