天天看点

编程之美之24点游戏

关于编程之美24点游戏的求解:

思想很简单,把array[i]和array[i+1]求加减乘除等运算,然后将值写入array[i+1],不难发现是一个递归子过程,代码不难写,如下:

#include <iostream>
#include <sstream>

using namespace std;

int array[] = {1, 2, 3, 4};
string arrayStr[] = {"1", "2", "3", "4"};
const int size = sizeof array / sizeof *array;

int cac24(int *array, string *arrayStr, const int size, int pos)
{
	stringstream ss;
	if (array == NULL || arrayStr == NULL || size <= 0 || pos == size)
		return -1;

	if (pos == size - 1)
	{
		if (array[pos] == 24)
			return 0;
		else
			return -1;
	}
	
	for (int i = pos; i < size - 1; i++)
	{
		for (int j = i + 1; j < size; j++)
		{
			int value1 = array[i];
			int value2 = array[j];
			string str1 = arrayStr[i];
			string str2 = arrayStr[j];
			
			int addValue = array[i] + array[j];
			int mulValue = array[i] * array[j];
			int mnsValue = array[i] - array[j];
			int mnsValue2 = array[j] - array[i];
			int divValue = -1;
			int divValue2 = -1;

			if (array[j] != 0)
				divValue = array[i] / array[j];
			if (array[i] != 0)
				divValue2 = array[j] / array[i];

			int tempValue = array[j];
			string tempStr = arrayStr[j];

			ss.str("");
			array[j] = addValue;
			ss << '(' << arrayStr[i] << '+' << tempStr << ')';
			arrayStr[j] = ss.str();
			if (cac24(array, arrayStr, size, pos + 1) == 0)
			{
				return 0;
			}
			ss.str("");

			array[j] = mnsValue;
			ss << '(' << arrayStr[i] << '-' << tempStr << ')';
			arrayStr[j] = ss.str();
			if (cac24(array, arrayStr, size, pos + 1) == 0)
				return 0;
			ss.str("");

			array[j] = mnsValue2;
			ss << '(' << tempStr << '-' << array[i] << ')';
			arrayStr[j] = ss.str();
			if (cac24(array, arrayStr, size, pos + 1) == 0)
				return 0;
			ss.str("");

			array[j] = mulValue;
			ss << '(' << arrayStr[i] << '*' << tempStr << ')';
			arrayStr[j] = ss.str();
			if (cac24(array, arrayStr, size, pos + 1) == 0)
				return 0;
			ss.str("");

			if (divValue != 0) 
			{
				array[j] = divValue;
				ss << '(' << arrayStr[i] << '/' << tempStr << ')';
				arrayStr[j] = ss.str();
				if (cac24(array, arrayStr, size, pos + 1) == 0)
					return 0;
				ss.str("");
			}

			if (divValue2 != 0)
			{
				array[j] = divValue2;
				ss << '(' << tempStr << '/' << arrayStr[i] << ')';
				arrayStr[j] = ss.str();
				if (cac24(array, arrayStr, size, pos + 1) == 0)
					return 0;
				ss.str("");
			}
		}
	}
}

void main()
{
	int result = cac24(array, arrayStr, size, 0);
	if (result == -1)
		cout << "wrong" << endl;
	else
		cout << arrayStr[size - 1] << endl;
}