经典的24点游戏,已知4个数字a,b,c,d。通过添加运算符(包含括号,0个、一个或两个括号)。通过分析可知,这四个数字的运算包括以下几种:不考虑数字顺序,?为任意运算符

1、a?b?c?d; 2、(a?b)?(c?d); 3、((a?b)\?c)\?d , (a?(b?c))?d; 4、a?(b?c)?d

那么问题可拆分为:两两组合后再运算,三个组合运算后的结果再与另一个数字运算。

一:两两运算共6种组合:

0

ab:a+b,a-b,a*b,b-a,a/b,b/a

1

ac:a+c,a-c,a*c,c-a,a/c,c/a

2

ad:a+d,a-d,a*d,d-a,a/d,d/a

3

bc:b+c,b-c,b*c,c-b,b/c,c/b

4

bd:b+d,b-d,b*d,d-b,b/d,d/b

5

cd:d+c,d-c,d*c,c-d,d/c,c/d

通过列表可知:当0与5,1与4,2与3再运算结果为abcd4个数字的运算结果,包含了公式1、2和4。

二、三个组合运算后再与另一个运算,可直接将另一个数字与24运算:

a与24:a+24,a-24,a*24,24-a,a/24,24/a

b与24:b+24,b-24,b*24,24-b,b/24,24/b

c与24:c+24,c-24,c*24,24-c,c/24,24/c

d与24:d+24,d-24,d*24,24-d,d/24,24/d

再细分下去为:

24与a

b与cd,c与bd,d与bc

24与b

a与cd,c与ad,d与ac

24与c

a与bd,b与ad,d与ab

24与d

a与bc,b与ac,c与ab

该运算结果包含公式2、3和4。

以上为4个数字之间添加运算符(包含括号)的所有情形。

具体代码如下:

#include <iostream>
using namespace std;
#include <vector>

bool two_N(double a,double b){//两两组合运算后再运算
    if(a+b==24||a-b==24||b-a==24||a*b==24||(b!=0&&a*1.00/b==24)||(a!=0&&b*1.00/a==24))return true;
    return false;
}
bool three_N(double f,int a,int b,int c,int d,vector<vector<double> > TN,int i){
    double e;
    if(i==0){//即24与a的运算结果,f是读取后的数
        for(int j=0;j<6;++j){
            e=TN[3][j];//b与cd运算结果运算再与f运算
            if(e+b==f||e-b==f||e*b==f||e*1.00/b==f||b-e==f||(e!=0&&b*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[4][j];//c与bd运算结果运算再与f运算
            if(e+c==f||e-c==f||e*c==f||e*1.00/c==f||c-e==f||(e!=0&&c*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[5][j];//d与bc运算结果运算再与f运算
            if(e+d==f||e-d==f||e*d==f||e*1.00/d==f||d-e==f||(e!=0&&d*1.00/e==f)) return true;
        }
    }
    if(i==1){//即24与b的运算结果,f是读取后的数
        for(int j=0;j<6;++j){
            e=TN[2][j];//c与ad运算结果运算再与f运算
            if(e+c==f||e-c==f||e*c==f||e*1.00/c==f||c-e==f||(e!=0&&c*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[1][j];//d与ac运算结果运算再与f运算
            if(e+d==f||e-d==f||e*d==f||e*1.00/d==f||d-e==f||(e!=0&&d*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[5][j];//a与cd运算结果运算再与f运算
            if(e+a==f||e-a==f||e*a==f||e*1.00/a==f||a-e==f||(e!=0&&a*1.00/e==f)) return true;
        }
    }
    if(i==2){//即24与c的运算结果,f是读取后的数
        for(int j=0;j<6;++j){
            e=TN[2][j];//b与ad运算结果运算再与f运算
            if(e+b==f||e-b==f||e*b==f||e*1.00/b==f||b-e==f||(e!=0&&b*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[0][j];//d与ab运算结果运算再与f运算
            if(e+d==f||e-d==f||e*d==f||e*1.00/d==f||d-e==f||(e!=0&&d*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[4][j];//a与bd运算结果运算再与f运算
            if(e+a==f||e-a==f||e*a==f||e*1.00/a==f||a-e==f||(e!=0&&a*1.00/e==f)) return true;
        }
    }
    if(i==3){//即24与d的运算结果,f是读取后的数
        for(int j=0;j<6;++j){
            e=TN[1][j];//b与ac运算结果运算再与f运算
            if(e+b==f||e-b==f||e*b==f||e*1.00/b==f||b-e==f||(e!=0&&b*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[0][j];//c与ab运算结果运算再与f运算
            if(e+c==f||e-c==f||e*c==f||e*1.00/c==f||c-e==f||(e!=0&&c*1.00/e==f)) return true;
        }
        for(int j=0;j<6;++j){
            e=TN[3][j];//a与bc运算结果运算再与f运算
            if(e+a==f||e-a==f||e*a==f||e*1.00/a==f||a-e==f||(e!=0&&a*1.00/e==f)) return true;
        }
    }
    return false;
}
int main() {
    int a, b, c, d;
    vector< vector<double> > two_num;
    vector< vector<double> > one_24;
    vector<double> tmp;
    while (cin >> a >> b >> c >> d) { // 注意 while 处理多个 case
    //初始化ab结果
        tmp.push_back(a+b),tmp.push_back(a-b),tmp.push_back(b-a);
        tmp.push_back(a*b),tmp.push_back((double)a*1.00/b),tmp.push_back(b*1.00/a);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化ac结果    
        tmp.push_back(a+c),tmp.push_back(a-c),tmp.push_back(c-a);
        tmp.push_back(a*c),tmp.push_back(a*1.00/c),tmp.push_back(c*1.00/a);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化ad结果
        tmp.push_back(a+d),tmp.push_back(a-d),tmp.push_back(d-a);
        tmp.push_back(a*d),tmp.push_back(a*1.00/d),tmp.push_back(d*1.00/a);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化bc结果
        tmp.push_back(c+b),tmp.push_back(c-b),tmp.push_back(b-c);
        tmp.push_back(c*b),tmp.push_back(c*1.00/b),tmp.push_back(b*1.00/c);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化bd结果
        tmp.push_back(d+b),tmp.push_back(d-b),tmp.push_back(b-d);
        tmp.push_back(a*d),tmp.push_back(d*1.00/b),tmp.push_back(b*1.00/d);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化cd结果
        tmp.push_back(c+d),tmp.push_back(c-d),tmp.push_back(d-c);
        tmp.push_back(c*d),tmp.push_back(d*1.00/c),tmp.push_back(c*1.00/d);
        two_num.push_back(tmp);
        tmp.clear();
    //初始化24和a的结果
        tmp.push_back(24+a),tmp.push_back(24-a),tmp.push_back(a-24);
        tmp.push_back(24*a),tmp.push_back(24.00/a),tmp.push_back(a*1.00/24.0);
        one_24.push_back(tmp);
        tmp.clear();
    //初始化24和b的结果
        tmp.push_back(24+b),tmp.push_back(24-b),tmp.push_back(b-24);
        tmp.push_back(24*b),tmp.push_back(24.00/b),tmp.push_back(b*1.00/24.0);
        one_24.push_back(tmp);
        tmp.clear();
    //初始化24和c的结果
        tmp.push_back(24+c),tmp.push_back(24-c),tmp.push_back(c-24);
        tmp.push_back(24*c),tmp.push_back(24.00/c),tmp.push_back(c*1.00/24.0);
        one_24.push_back(tmp);
        tmp.clear();
    //初始化24和d的结果
        tmp.push_back(24+d),tmp.push_back(24-d),tmp.push_back(d-24);
        tmp.push_back(24*d),tmp.push_back(24.00/d),tmp.push_back(d*1.00/24.0);
        one_24.push_back(tmp);
        tmp.clear();
    //两两组合后的结果再运算,即ab与cd,ac与bd,ad与bc 
        for(int i=0;i<3;++i) {
            for(int j=0;j<6;++j){
                for(int k=0;k<6;++k){
                    if(two_N(two_num[i][j],two_num[5-i][k])){
                        cout<<"true"<<endl;
                        return 0;
                    }
                }
            }
        }
    //其中一个数字与其他三个数字运算后的结果之间的运算,即a与bcd,b与acd,c与abd,d与abc    
        for(int i=0;i<4;++i){
            for(int j=0;j<6;++j){
                if(three_N(one_24[i][j],a,b,c,d,two_num,i)){
                    cout<<"true"<<endl;
                    return 0;
                }
            }
        }
        two_num.clear();
        one_24.clear();
        cout<<"false"<<endl;
    }
    return 0;
}