ZZULIOJ 1219: 速算24点

时间限制: 1 Sec  内存限制: 128 MB
提交: 155  解决: 34
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

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

输入

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

输出

如果有解则输出"Y",无解则输出"N"。

样例输入 Copy

A 2 3 6

样例输出 Copy

Y

来源/分类

 

[提交] [状态]

有点羞涩,之前的代码过得了zzulioj,过不了HDOJ,改了下程序,现在都能过了。

思路:

实现就是全排列四个数字,然后再枚举操作。DFS函数可以解决(a * b) - c + d, c / (b + d) + a等等这种三个数字先进行操作,

然后再另外一个数字操作。但是可能会出现(a * b) + (c * d)这种两个先结合再运算的操作,我们使用check_two函数,即先

处理两个数之间的操作,然后再看每一对之间是否能通过四则运算组成24。

#include
using namespace std;
int a[10];  // 输入的数字
int num[10];
int flag = 0;
int get_num(string s)
{
	if (s.size() == 2)
		return 10;
	if (s <= "9" && s >= "0")
		return s[0] - '0';
	else
		if (s == "J")
			return 11;
		else
			if (s == "Q")
				return 12;
			else
				if (s == "K")
					return 13;
				else
					if (s == "A")
						return 1;
}
void dfs(int num, int d)
{
	if (flag == 1)
		return;
	if (d == 3)
	{
		if (num == 24)
			flag = 1;
		return;
	}
	else
	{
		for (int i = 1; i <= 7; i++)
		{
			if (i == 1)
				dfs(num + a[d + 1], d + 1);
			if (i == 2)
				dfs(num - a[d + 1], d + 1);
			if (i == 3)
				dfs(num * a[d + 1], d + 1);
			if (a[d + 1] != 0 && i == 4 && num % a[d + 1] == 0)
				dfs(num / a[d + 1], d + 1);
			if (i == 5)
				dfs(a[d + 1] - num, d + 1);
			if (i == 6)
				dfs(a[d + 1] - num, d + 1);
			if (i == 7 && num != 0 && a[d + 1] % num == 0)
				dfs(a[d + 1] / num, d + 1);
		}
	}
	return;
}
void check_two()
{
	num[1] = a[0] + a[1], num[2] = a[0] - a[1], num[3] = a[0] * a[1];
	if (a[0] % a[1] != 0)
		num[4] = -1000;
	else
		num[4] = a[0] / a[1];
	num[5] = a[2] + a[3], num[6] = a[2] - a[3], num[7] = a[2] * a[3];
	if (a[2] % a[3] != 0)
		num[8] = -1000;
	else
		num[8] = a[2] / a[3];
	for (int i = 1; i <= 4; i++)
	{
		for (int j = 5; j <= 8; j++)
		{
			if (i == j  || a[i] == -1000 || a[j] == -1000)
				continue;
			for (int k = 1; k <= 4; k++)
			{
				int num1 = 0;
				if (k == 1)
					num1 = num[i] + num[j];
				if (k == 2)
					num1 = num[i] - num[j];
				if (k == 3)
					num1 = num[i] * num[j];
				if (k == 4)
				{
					if (num[j] != 0 && num[i] % num[j] == 0)
						num1 = num[i] / num[j];
					else
						num1 = -1000;
				}
				if (num1 == 24)
				{
					flag = 1;
					return;
				}			
			}
		}
	}
	flag = 0;
	return;
}
int main(){
	string s;
	int cnt = 0;
	for (int i = 1; i <= 4; i++)
	{
		cin >> s;
		a[cnt++] = get_num(s);
	}
	sort(a, a + cnt);
	do
	{
		flag = 0;
		dfs(a[0], 0);
		if (flag != 1)
			check_two();
		if (flag == 1)
		{
			cout << "Y" << endl;
			return 0;
		}
	} while (next_permutation(a, a + cnt));
	cout << "N" << endl;
	return 0;
}

 

 

你可能感兴趣的:(ZZULIOJ,搜索,模拟)