rendered paste body/* main.cc
*******************
* Author: Thomas Karpiniec
* Last Modified: 16 Dec 2005
*/
#include <iostream>
void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo);
void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers);
void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* order, int* selectFrom);
int calculate(int totalNum, int currentNum, double* numbers, int* operators, int* order);
int main(int nArgs, char* pszArgs[])
{
double numbers[4] = {24.0,7.0,8.0,11.0};
numberCycle(4,1,numbers,NULL);
return 0;
}
void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo)
{
if (addTo == NULL)
addTo = new double[totalNum];
for (int i = 0; i < (totalNum-currentNum + 1); i++)
{
addTo[currentNum - 1] = selectFrom[i];
if (totalNum - currentNum == 0)
{
//std::cout << addTo[0] << addTo[1] << addTo[2] << addTo[3] << std::endl;
// AddTo now points to an array of integers - pass it off.
operatorCycle(3, 1, NULL, addTo);
}
else
{
double newSelectFrom[totalNum];
for (int j = 0; j < totalNum; j++)
newSelectFrom[j] = selectFrom[j];
newSelectFrom[i] = newSelectFrom[totalNum-currentNum];
numberCycle(totalNum, currentNum + 1, newSelectFrom, addTo);
}
}
}
void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers)
{
if (addTo == NULL)
addTo = new int[totalNum];
for (int i = 0; i < (totalNum + 1); i++)
{
addTo[currentNum-1] = i;
if (currentNum == totalNum)
{
//std::cout << addTo[0] << addTo[1] << addTo[2] << std::endl;
// AddTo now points to an array of operators represented as integers
// Grab it and the existing "numbers" array, and pass it off
orderCycle(3,1,numbers,addTo,NULL,NULL);
}
else
{
operatorCycle(totalNum, currentNum + 1, addTo, numbers);
}
}
}
void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* order, int* selectFrom)
{
if (order == NULL)
order = new int[totalNum];
if (selectFrom == NULL)
{
selectFrom = new int[totalNum];
for (int i = 0; i < totalNum; i++)
selectFrom[i] = i;
}
for (int i = 0; i < (totalNum - currentNum + 1); i++)
{
order[currentNum - 1] = selectFrom[i];
if (currentNum == totalNum)
{
std::cout << "No. ";
for (int k = 0; k < 4; k++)
std::cout << numbers[k] << " ";
std::cout << "Op. ";
for (int k = 0; k < 3; k++)
std::cout << operators[k] << " ";
std::cout << "Or. ";
for (int k = 0; k < 3; k++)
std::cout << order[k] << " ";
std::cout << std::endl;
if (calculate(4,1,numbers,operators,order) == 1)
std::cout << "FOUND ONE" << std::endl;
}
else
{
int newSelectFrom[totalNum];
for (int j = 0; j < totalNum; j++)
newSelectFrom[j] = selectFrom[j];
newSelectFrom[i] = selectFrom[totalNum-currentNum];
orderCycle(totalNum, currentNum + 1, numbers, operators, order, newSelectFrom);
}
}
}
int calculate(int totalNum, int currentNum, double* numbers, int* operators, int* order)
{
if (totalNum > currentNum - 1)
{
double newNumbers[totalNum - currentNum];
int newOperators[totalNum - currentNum - 1];
int newOrder[totalNum - currentNum - 1];
int minimumIndex = 0;
for (int i = 0; i < (totalNum - currentNum + 1); i++)
if (order[i] < order[minimumIndex])
minimumIndex = i;
double result = 0.0;
switch(operators[minimumIndex])
{
case 0:
result = numbers[minimumIndex] + numbers[minimumIndex + 1];
break;
case 1:
result = numbers[minimumIndex] - numbers[minimumIndex + 1];
break;
case 2:
result = numbers[minimumIndex] * numbers[minimumIndex + 1];
break;
case 3:
result = numbers[minimumIndex] / numbers[minimumIndex + 1];
break;
}
int fillPoint = 0;
for (int i = 0; i < minimumIndex; i++)
newNumbers[fillPoint++] = numbers[i];
newNumbers[fillPoint++] = result;
for (int i = minimumIndex+2; i < totalNum - currentNum; i++)
newNumbers[fillPoint++] = numbers[i];
fillPoint = 0;
for (int i = 0; i < minimumIndex; i++)
{
newOperators[fillPoint] = operators[i];
newOrder[fillPoint++] = order[i];
}
for (int i = minimumIndex + 1; i < totalNum - 1; i++)
{
newOperators[fillPoint] = operators[i];
newOrder[fillPoint++] = order[i];
}
if (calculate(totalNum, currentNum + 1, newNumbers, newOperators, newOrder) == 1)
return 1;
else
return 0;
}
else
{
if (numbers[0] == 24.0)
return 1;
else
return 0;
}
}