递归法实现24点游戏

24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。

递归算法将四个数变为三个数的计算,再变为两个数的计算
(1) 将4个整数放入数组中

(2) 在数组中取两个数字的排列,共有 P(4,2) 种排列。对每一个排列,对 + - * / 每一个运算符, 根据此排列的两个数字和运算符,计算结果
改表数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中,对新的数组,重复步骤 2
恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉

#include <iostream>
#include <string>
#include <math.h>
#include <fstream>
using namespace std;

const double LING=1E-6;
const int COUNT=4;
const int VOLUE= 24;
double num[COUNT];
string E[COUNT];

bool Game(int n)
{
    if (n==1) 
	{
        if (fabs(num[0]-VOLUE)<LING) 
		{
			cout<<E[0]<<"="<<VOLUE<< endl;

			ofstream mycout("TopList.txt");  //将结果写入文件中
			mycout<<E[0]<<"="<<VOLUE<<endl;
			mycout.close();
            return true;    //判断是否有解
        } 
		else 
		{
            return false;
        }
    }

    for (int i=0;i<n;i++) 
	{
        for (int j=i+1;j<n;j++) 
		{
            double a, b;
            string A, B;
            a=num[i];
            b=num[j];
            num[j]=num[n-1];  //递归之后,n比以前小一位,不停向前赋值

            A=E[i];
            B=E[j];
            E[j]=E[n - 1];   //递归之后,n比以前小一位,不停向前赋值

            E[i] = '(' +A+ '+' +B+ ')';  //判断加法能否算出
            num[i] = a + b;
            if ( Game(n - 1) ) return true;
            
            E[i] = '(' +A+ '-' +B+ ')';  //判断减法能否算出(需要分顺序)
            num[i] = a - b;
            if ( Game(n - 1) ) return true;
            
            E[i] = '(' +A+ '-' +B+ ')';  
            num[i] = b - a;
            if ( Game(n - 1) ) return true;
                        

            E[i] = '(' +A+ '*' +B+ ')';  //判断乘法能否算出
            num[i] = a * b;
            if ( Game(n - 1) ) return true;

            if (b != 0) {
                E[i] = '(' +A+ '/' +B+ ')';  //判断除法能否算出(需要分顺序)
                num[i] = a / b;
                if ( Game(n - 1) ) return true;
            } 
            if (a != 0) {
                E[i] = '(' +A+ '/' +B+ ')';  
                num[i] = b / a;
                if ( Game(n - 1) ) return true;
            }
            num[i] = a;  //如果上面几种可能都失败了,把原来的赋值撤消,以无干扰的正确的进入到下一次for循环队列中。
            num[j] = b;
            E[i] = A;
            E[j] = B;
        }
    }
    return false;
}

/*主函数*/
int main(int argc, char* argv[])
{
	cout<<"*****************欢迎来到24点游戏****************"<<endl;
	cout<<"请输入4个数(1—13)"<<endl;
    for (int i=0;i<COUNT;i++) 
	{
        char game[20];
        int  x;
        cin>>x;    //读入数据
        num[i]=x;
        itoa(x,game,10);  //itoa()函数把第一个数值传送到第二个(字符串)中去,第三个参数以int型存放。
        E[i]=game;
    }
    if (Game(COUNT)) 
	{
        cout<< "成功!" << endl;
    } 
	else 
	{
        cout<< "没有结果..." << endl;
    }        
    return 0;
}

递归法实现24点游戏

递归法实现24点游戏