24点游戏

题目描述
给出4个正整数操作数,你的任务是使用运算符(+,-,*,/)和括号对操作数进行计算,分析是否能得到24,每个操作数只能使用1次,运算符和括号可以多次使用,注意所有的中间结果都必须是整数。
输入格式
输入包括多行,每行4个正整数,范围是[1,13],输入以0 0 0 0标记结束
输出格式
若输入的4个操作数能计算出24,输出Yes,否则输出No
输入样例
1 1 1 1
2 5 7 8
0 0 0 0
输出样例
No
Yes

#include<iostream>
using namespace std;
int v[4];
bool func(int n)
{
	if (n == 1)
		return v[0] == 24;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (i == j)
				continue;
			int op1 = v[i], op2 = v[j];
			v[i] = op1 + op2;
			v[j] = v[n - 1];
			if (func(n - 1))
				return 1;
			v[i] = op1 - op2;
			if (func(n - 1))
				return 1;
			v[i] = op1 * op2;
			if (func(n - 1))
				return 1;
			if (op2 != 0 && op1 % op2 == 0)
			{
				v[i] = op1 / op2;
				if (func(n - 1))
					return 1;
			}
			v[i] = op1;
			v[j] = op2;
		}
	}
	return 0;
}
int main()
{
	int a, b, c, d;
	while (cin >> a >> b >> c >> d)
	{
		if (a == b && b == c && c == d && a == 0)
			break;
		v[0] = a;
		v[1] = b;
		v[2] = c;
		v[3] = d;
		if (func(4))
			cout << "Yes"<<endl;
		else cout << "No" << endl;
	}
}

运用递归加回溯法,通过双层循环寻找每次的两个操作数,对两个操作数进行操作,将得到的结果存入数组中,继续深度搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Agreenhan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值