关于编程之美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;
}