您的位置:首页 > 其它

hdoj 1427 速算24点 【经典DFS】

2015-06-18 21:51 155 查看


速算24点

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3664 Accepted Submission(s): 899



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



同上一篇解题,就是多了处理字符串这一点,还有需要判断能否整除,因为题目要求计算过程不能出现小数。

思路:用数组存储这4个数以及这4个数中任意两个之间的加减乘除的结果(记录结果时,不要用数组下标自增一,因为当前存储的结果 可能不是 正确达到24的中间的结果)。每次取没有使用的两个数,继续进行加减乘除的操作。等到操作次数达到4时,判断当前结果有没有达到24。 注意过程中不能出现小数!

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[10];//存储4个数字 和 通过数字得到的 结果 
bool vis[10];//标记当前数字 或者 结果是否使用过 
int bian(char x)
{
	if(x == 'A') return 1;
	else if(x >= '1' && x <= '9') return x - '0';
	else if(x == 'J') return 11;
	else if(x == 'Q') return 12;
	else if(x == 'K') return 13; 
}
int dfs(int use, int total)//use 已使用的数字个数 total 数组存储的数字及结果个数 
{
	int i, j;
	if(use == 4)//已用4个数字 判定最新结果 
	{
		if(num[total-1] == 24)
		return 1;
		else
		return 0;
	}
	for(i = 0; i < total-1; i++)
	{
		if(vis[i]) continue;//已经使用 
		vis[i] = true;
		for(j = i+1; j < total; j++)
		{
			if(vis[j]) continue;
			vis[j] = true;
			num[total] = num[i] + num[j]; if(dfs(use+1, total+1)) return 1;
			num[total] = num[i] - num[j]; if(dfs(use+1, total+1)) return 1;
			num[total] = num[j] - num[i]; if(dfs(use+1, total+1)) return 1;
			num[total] = num[i] * num[j]; if(dfs(use+1, total+1)) return 1;
			if(num[j])
			{
				if(num[i] % num[j] == 0)
				{
					num[total] = num[i] / num[j]; if(dfs(use+1, total+1)) return 1;
				}
			}
			if(num[i])
			{
				if(num[j] % num[i] == 0)
				{
					num[total] = num[j] / num[i]; if(dfs(use+1, total+1)) return 1;
				}
			} 
			vis[j] = false;//搜索失败 去掉标记 
		}
		vis[i] = false;//去标记 
	} 
	return 0;
}
int main()
{
	char a[4][2];
	int i, j;		
	while(scanf("%s%s%s%s", a[0], a[1], a[2], a[3]) != EOF)
	{
		for(i = 0; i < 4; i++)
		{
			if(strlen(a[i]) > 1)
			num[i] = 10;
			else
			num[i] = bian(a[i][0]);
		}
		memset(vis, false, sizeof(vis));
		if(dfs(1, 4))
		printf("Yes\n");
		else
		printf("No\n");
	} 
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: