24点小游戏算法

要求:1-9任意四个数字,利用加减乘除括号五种运算使最终结果等于24;如果能达到要求,打印所有方法(同样的加减乘除,括号不同位置算两种不同的方法);若不能达到要求,打印“不能计算达到24”。

思考过程:四个数字,三步运算,二个括号,而这两个括号的位置有五种不同的情况。也就是说,不论运算符号是什么,利用括号都可以有五种不同的运算顺序。
(1)((x,y),z),w
(2)(x,y),(z,w)
(3)(x,(y,z),w)
(4)x,((y,z),w)
(5)x,((y,(z,w))

因此,我的代码实现过程是,由于三步运算,就利用三重循环。每一步循环定义了五个局部变量来记录五种情况各自的第一步的暂时结果,在最后一步进行判断结果是否为24(在第三步循环之内)。如果是,则需要打印计算过程。

for (int i = 1; i < 5; i++)
	{
		suma = cal(i, x, y);
		sumb = cal(i, x, y);
		sumc = cal(i, y, z);
		sumd = cal(i, y, z);
		sume = cal(i, z, w);
		
		for (int j = 1; j < 5; j++)
		{
			suma1 = cal(j, suma, z);
			sumb1 = cal(j, z, w);
			sumc1 = cal(j, x, sumc);
			sumd1 = cal(j, sumd, w);
			sume1 = cal(j, y, sume);

			for (int k = 1; k < 5; k++)
			{
		              suma2 = cal(k, suma1, w);
			      sumb2 = cal(k, sumb, sumb1);
			      sumc2 = cal(k, sumc1, w);
			      sumd2 = cal(k, x, sumd1);
			      sume2 = cal(k, x, sume1);
			      //加上判断
          //其中cal(int n,int x,int y)的功能是根据n的值决定对x,y做什么运算,返回结果。
			 }
	         }
	 }

有人可能会问,是不是需要一个容器来记录前面每一步过程做的运算?

其实是不需要的。三步循环,也就是三个运算符(不考虑括号,因为括号是根据五种运算顺序事先就已经决定好了的。),设循环变量分别为i,j,k,在做最内层循环的时候,是有对应的i,j的,只要利用一个函数将i,j,k与运算符号相对应起来就可以了!也就是一个函数参数为0-4(1-5也可),函数体为switch…case或者if…else if…去对应运算符号即可。这样在第三层循环内判断完之后打印时,直接利用i,j,k 即可判断运算过程。

附上源码供参考

#include<iostream>
using namespace std;
double cal(int n, double x, double y)
{
	double f;
	if (n == 1)
		f = x + y;
	else if (n == 2)
		f = x*y;
	else if (n == 3)
		f = x / y;
	else if (n == 4)
		f = x - y;
	return f;
}

void print(int n)
{
	if (n == 1)
		cout << '+';
	else if (n == 2)
		cout << '*';
	else if (n == 3)
		cout << '/';
	else if (n == 4)
		cout << '-';
}

int main()
{
	double x, y, z, w;
	int leap = 0;
	while (1)
	{
		cout << "please input four integer between 1 to 9 : ";
		cin >> x >> y >> z >> w;
		if (cin.fail())
		{
			cin.clear();
			cin.ignore(1024, '\n');
		}
		else if (x < 10 && x>0 && y < 10 && y>0 && z < 10 && z>0 && w < 10 && w>0)
			break;
	}
	for (int i = 1; i < 5; i++)
	{
		double suma = 0, suma1 = 0, suma2 = 0;
		double sumb = 0, sumb1 = 0, sumb2 = 0;
		double sumc = 0, sumc1 = 0, sumc2 = 0;
		double sumd = 0, sumd1 = 0, sumd2 = 0;
		double sume = 0, sume1 = 0, sume2 = 0;

		suma = cal(i, x, y);
		sumb = cal(i, x, y);
		sumc = cal(i, y, z);
		sumd = cal(i, y, z);
		sume = cal(i, z, w);
		
		for (int j = 1; j < 5; j++)
		{
			suma1 = cal(j, suma, z);
			sumb1 = cal(j, z, w);
			sumc1 = cal(j, x, sumc);
			sumd1 = cal(j, sumd, w);
			sume1 = cal(j, y, sume);

			for (int k = 1; k < 5; k++)
			{
				suma2 = cal(k, suma1, w);
				sumb2 = cal(k, sumb, sumb1);
				sumc2 = cal(k, sumc1, w);
				sumd2 = cal(k, x, sumd1);
				sume2 = cal(k, x, sume1);

				if (suma2 == 24)
				{
					leap = 1;
					cout << "((" << x;
					print(i);
					cout << y << ")";
					print(j);
					cout << z << ")";
					print(k);
					cout << w << "=24" << endl;
				}
				
				if (sumb2 == 24)
				{
					leap = 1;
					cout << "(" << x;
					print(i);
					cout << y << ")";
					print(k);
					cout  << "(" << z;
					print(j);
					cout << w << ")=24" << endl;
				}
				
				if (sumc2 == 24)
				{
					leap = 1;
					cout << "(" << x;
					print(j);
					cout << "(" << y ;
					print(i);
					cout << z << "))";
					print(k);
					cout << w << "=24" << endl;
				}
				
				if (sumd2 == 24)
				{
					leap = 1;
					cout << x;
					print(k);
					cout << "((" << y ;
					print(i);
					cout << z << ")";
					print(j);
					cout << w << ")=24" << endl;
				}
				
				if (sume2 == 24)
				{
					leap = 1;
					cout << x;
					print(k);
					cout << "(" << y ;
					print(j);
					cout << "(" << z;
					print(i);
					cout << w << "))=24" << endl;
				}

			}
		}
	}
	if (leap == 0)
		cout << "无解" << endl;
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值