经典的24点游戏,已知4个数字a,b,c,d。通过添加运算符(包含括号,0个、一个或两个括号)。通过分析可知,这四个数字的运算包括以下几种:不考虑数字顺序,?为任意运算符
1、; 2、; 3、((a?b)\?c)\?d , (a?(b?c))?d; 4、
那么问题可拆分为:两两组合后再运算,三个组合运算后的结果再与另一个数字运算。
一:两两运算共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; }