24点算法(加括号)

24点算法,结合网上资料整理

24点经典算法 - mingWar的专栏 - 博客频道 - CSDN.NET

http://blog.csdn.net/mingwar/article/details/3410735

#include <iostream>
#include <string>
#include <math.h>

using namespace std;
const  double Threshold = 1e-6;
const int CardsNumber = 4;
const int ResultValue = 24;
double number[CardsNumber];
string result[CardsNumber];
bool all = true;//all为true输出所有答案,为false输出一个答案


bool PointGame(int n)
{
	if(n == 1)
	{
		if(fabs(number[0] - ResultValue) < Threshold)
		{
			cout << result[0] << endl;
			if (!all)
			{
				return true;
			}
			
		}
		else
		{
			if (!all)
			{
				return false;
			}
			
		}
	}

	//两个for循环获得初始的两个数(i=0:[((a,b),d),c];i=1:[((b,c),a),d];i=2:[(c,d),(a,b)])
	for(int i = 0; i < n; i++)
	{

		for(int j = i + 1 ; j < n; j++)
		{
			double a, b;  //a保存上一步操作的结果,b保存这一次将要操作的数
			string expa, expb; //expa保存已有的表达式, expb保存将要操作的表达式

			a = number[i];  //保留上一步操作的结果(根据初始i的不同,a,b,number的功能需互换)
			b = number[j];  //保留这一步操作的数
			number[j] = number[n - 1]; //获取下一步要操作的数

			expa = result[i];          //保留上一步操作的表达式
			expb = result[j];          //保留这一步操作的表达式
			result[j] = result[n-1];   //获取下一步操作的表达式

			number[i] = a + b;                          //存储操作的结果
			result[i] = '(' + expa + '+' + expb + ')';  //存储操作的表达式
			if(PointGame(n-1))
			{
				return true;
			}

			number[i] = a - b;
			result[i] = '(' + expa + '-' + expb + ')';
			if(PointGame(n-1))
			{
				return true;
			}

			number[i] = b - a;
			result[i] = '(' + expb + '-' + expa + ')';
			if(PointGame(n-1))
			{
				return true;
			}

			number[i] = a * b;
			result[i] = '(' + expa + '*' + expb + ')';
			if(PointGame(n-1))
			{
				return true;
			}

			if(b != 0)
			{
				number[i] = a / b;
				result[i] = '(' + expa + '/' + expb + ')';
				if(PointGame(n-1))
				{
					return true;
				}
			}                     

			if(a != 0)
			{
				number[i] = b / a;
				result[i] = '(' + expb + '/' + expa + ')';
				if(PointGame(n-1))
				{
					return true;
				}
			}

			number[i] = a;
			number[j] = b;
			result[i] = expa;
			result[j] = expb;

		}
	}
	return false;

}

void main()
{
	int m,n;
	int a = 1;
	int b = (a++) + (a) +(++a);
	
	int x;
	for(int i =0; i< CardsNumber; i++)
	{
		cout << "the " << i << "the number: ";
		cin >> x;
		number[i] = x;
		result[i] = (char)(x + '0');
	}

	if(PointGame(CardsNumber))
	{
		cout << "Success" << endl;
	}
	else
	{
		cout << "failure" << endl;
	}
	system("pause");

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值