24点游戏(简单版)

img


#include
using namespace std;

int x,y,z,w,ans;
char a[5] = {'0','+','-','*','/'};
bool flag = false;

int ja(int x,int y){return x + y;}

int jn(int x,int y){return x - y;}

int cg(int x,int y){return x * y;}

int cu(int x,int y){return x / y;}

void f(int f,char a,int g,char b,int h,char c,int j){
    if(a == '+' && b == '+' && c == '+' && f+g+h+j == 24){flag = true;return;}
    if(a == '+' && b == '+' && c == '-' && f+g+h-j == 24){flag = true;return;}
    if(a == '+' && b == '+' && c == '*' && f+g+h*j == 24){flag = true;return;}
    if(a == '+' && b == '+' && c == '/' && f+g+h/j == 24){flag = true;return;}
    
    if(a == '+' && b == '-' && c == '+' && f+g-h+j == 24){flag = true;return;}
    if(a == '+' && b == '-' && c == '-' && f+g-h-j == 24){flag = true;return;}
    if(a == '+' && b == '-' && c == '*' && f+g-h*j == 24){flag = true;return;}
    if(a == '+' && b == '-' && c == '/' && f+g-h/j == 24){flag = true;return;}
    
    if(a == '+' && b == '*' && c == '+' && f+g*h+j == 24){flag = true;return;}
    if(a == '+' && b == '*' && c == '-' && f+g*h-j == 24){flag = true;return;}
    if(a == '+' && b == '*' && c == '*' && f+g*h*j == 24){flag = true;return;}
    if(a == '+' && b == '*' && c == '/' && f+g*h/j == 24){flag = true;return;}
    
    if(a == '+' && b == '/' && c == '+' && f+g/h+j == 24){flag = true;return;}
    if(a == '+' && b == '/' && c == '-' && f+g/h-j == 24){flag = true;return;}
    if(a == '+' && b == '/' && c == '*' && f+g/h*j == 24){flag = true;return;}
    if(a == '+' && b == '/' && c == '/' && f+g/h/j == 24){flag = true;return;}
    
    if(a == '-' && b == '+' && c == '+' && f-g+h+j == 24){flag = true;return;}
    if(a == '-' && b == '+' && c == '-' && f-g+h-j == 24){flag = true;return;}
    if(a == '-' && b == '+' && c == '*' && f-g+h*j == 24){flag = true;return;}
    if(a == '-' && b == '+' && c == '/' && f-g+h/j == 24){flag = true;return;}
    
    if(a == '-' && b == '-' && c == '+' && f-g-h+j == 24){flag = true;return;}
    if(a == '-' && b == '-' && c == '-' && f-g-h-j == 24){flag = true;return;}
    if(a == '-' && b == '-' && c == '*' && f-g-h*j == 24){flag = true;return;}
    if(a == '-' && b == '-' && c == '/' && f-g-h/j == 24){flag = true;return;}
    
    if(a == '-' && b == '*' && c == '+' && f-g*h+j == 24){flag = true;return;}
    if(a == '-' && b == '*' && c == '-' && f-g*h-j == 24){flag = true;return;}
    if(a == '-' && b == '*' && c == '*' && f-g*h*j == 24){flag = true;return;}
    if(a == '-' && b == '*' && c == '/' && f-g*h/j == 24){flag = true;return;}
    
    if(a == '-' && b == '/' && c == '+' && f-g/h+j == 24){flag = true;return;}
    if(a == '-' && b == '/' && c == '-' && f-g/h-j == 24){flag = true;return;}
    if(a == '-' && b == '/' && c == '*' && f-g/h*j == 24){flag = true;return;}
    if(a == '-' && b == '/' && c == '/' && f-g/h/j == 24){flag = true;return;}
    
    if(a == '*' && b == '+' && c == '+' && f*g+h+j == 24){flag = true;return;}
    if(a == '*' && b == '+' && c == '-' && f*g+h-j == 24){flag = true;return;}
    if(a == '*' && b == '+' && c == '*' && f*g+h*j == 24){flag = true;return;}
    if(a == '*' && b == '+' && c == '/' && f*g+h/j == 24){flag = true;return;}
    
    if(a == '*' && b == '-' && c == '+' && f*g-h+j == 24){flag = true;return;}
    if(a == '*' && b == '-' && c == '-' && f*g-h-j == 24){flag = true;return;}
    if(a == '*' && b == '-' && c == '*' && f*g-h*j == 24){flag = true;return;}
    if(a == '*' && b == '-' && c == '/' && f*g-h/j == 24){flag = true;return;}

    if(a == '*' && b == '*' && c == '+' && f*g*h+j == 24){flag = true;return;}
    if(a == '*' && b == '*' && c == '-' && f*g*h-j == 24){flag = true;return;}
    if(a == '*' && b == '*' && c == '*' && f*g*h*j == 24){flag = true;return;}
    if(a == '*' && b == '*' && c == '/' && f*g*h/j == 24){flag = true;return;}
    
    if(a == '*' && b == '/' && c == '+' && f*g/h+j == 24){flag = true;return;}
    if(a == '*' && b == '/' && c == '-' && f*g/h-j == 24){flag = true;return;}
    if(a == '*' && b == '/' && c == '*' && f*g/h*j == 24){flag = true;return;}
    if(a == '*' && b == '/' && c == '/' && f*g/h/j == 24){flag = true;return;}
    
    if(a == '/' && b == '+' && c == '+' && f/g+h+j == 24){flag = true;return;}
    if(a == '/' && b == '+' && c == '-' && f/g+h-j == 24){flag = true;return;}
    if(a == '/' && b == '+' && c == '*' && f/g+h*j == 24){flag = true;return;}
    if(a == '/' && b == '+' && c == '/' && f/g+h/j == 24){flag = true;return;}
    
    if(a == '/' && b == '-' && c == '+' && f/g-h+j == 24){flag = true;return;}
    if(a == '/' && b == '-' && c == '-' && f/g-h-j == 24){flag = true;return;}
    if(a == '/' && b == '-' && c == '*' && f/g-h*j == 24){flag = true;return;}
    if(a == '/' && b == '-' && c == '/' && f/g-h/j == 24){flag = true;return;}
    
    if(a == '/' && b == '*' && c == '+' && f/g*h+j == 24){flag = true;return;}
    if(a == '/' && b == '*' && c == '-' && f/g*h-j == 24){flag = true;return;}
    if(a == '/' && b == '*' && c == '*' && f/g*h*j == 24){flag = true;return;}
    if(a == '/' && b == '*' && c == '/' && f/g*h/j == 24){flag = true;return;}
    
    if(a == '/' && b == '/' && c == '+' && f/g/h+j == 24){flag = true;return;}
    if(a == '/' && b == '/' && c == '*' && f/g/h*j == 24){flag = true;return;}
    if(a == '/' && b == '/' && c == '/' && f/g/h/j == 24){flag = true;return;}
    
    return;
}

int main(){
    //freopen("game15.in","r",stdin);
    //freopen("game15.out","w",stdout);
    scanf("%d %d %d %d",&x,&y,&z,&w);
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],y,a[j],z,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],y,a[j],w,a[k],z);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],z,a[j],y,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],z,a[j],w,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],w,a[j],z,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(x,a[i],w,a[j],y,a[k],z);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],x,a[j],z,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],x,a[j],w,a[k],z);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],z,a[j],x,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],z,a[j],w,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],w,a[j],z,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(y,a[i],w,a[j],x,a[k],z);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],y,a[j],x,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],y,a[j],w,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],x,a[j],y,a[k],w);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],x,a[j],w,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],w,a[j],x,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(z,a[i],w,a[j],y,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],y,a[j],z,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],y,a[j],x,a[k],z);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],z,a[j],y,a[k],x);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],z,a[j],x,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],x,a[j],z,a[k],y);
            }
        }
    }for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            for(int k=1;k<=4;k++){
                f(w,a[i],x,a[j],y,a[k],z);
            }
        }
    }
    if(!flag)printf("No");
    else printf("Yes");
    return 0;
}

##有人指导优化一下吗?
#c++/c/Python都可以,可能比较简单

终极版:

//定义下面5种运算顺序:
// ((A @   B) @  C)  @ D  =
//  (A @   B) @ (C   @ D) =
//  (A @  (B  @  C)) @ D  =
//   A @ ((B  @  C)  @ D) =
//   A @  (B  @ (C   @ D))=
//23.99<计算结果<24.01
//其中:
//1≤A、B、C、D≤13
//@为“+、-、*、/”之一
//用浮点数计算,循环遍历以上所有情况即可。
#include <stdio.h>
#define when break;case
int A,B,C,D,N;
float r,r1,r2;
char op1,op2,op3;
char opc[4]={'+','-','*','/'};
void main() {
    N=0;
    for (A  =1;A  <=13;A  ++) {
    for (B  =1;B  <=13;B  ++) {
    for (C  =1;C  <=13;C  ++) {
    for (D  =1;D  <=13;D  ++) {
    for (op1=0;op1<  4;op1++) {
    for (op2=0;op2<  4;op2++) {
    for (op3=0;op3<  4;op3++) {
        // ((A @   B) @  C)  @ D
        r=(float)A;
        switch (op1) {case 0:r =r +B ;when 1:r =r -B ;when 2:r =r *B ;when 3:                                      r =r /B ;break;}
        switch (op2) {case 0:r =r +C ;when 1:r =r -C ;when 2:r =r *C ;when 3:                                      r =r /C ;break;}
        switch (op3) {case 0:r =r +D ;when 1:r =r -D ;when 2:r =r *D ;when 3:                                      r =r /D ;break;}
        if (23.99f<r && r<24.01f) {N++;printf("%5d: ((%2d %c   %2d) %c  %2d)  %c %2d  =24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

        //  (A @   B) @ (C   @ D)
        r1=(float)A;
        switch (op1) {case 0:r1=r1+B ;when 1:r1=r1-B ;when 2:r1=r1*B ;when 3:                                      r1=r1/B ;break;}
        r2=(float)C;
        switch (op3) {case 0:r2=r2+D ;when 1:r2=r2-D ;when 2:r2=r2*D ;when 3:                                      r2=r2/D ;break;}
        switch (op2) {case 0:r =r1+r2;when 1:r =r1-r2;when 2:r =r1*r2;when 3:if (-0.01f<r2 && r2<0.01f) goto STEP3;r =r1/r2;break;}
        if (23.99f<r && r<24.01f) {N++;printf("%5d:  (%2d %c   %2d) %c (%2d   %c %2d) =24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

        //  (A @  (B  @  C)) @ D
    STEP3:
        r=(float)B;
        switch (op2) {case 0:r =r +C ;when 1:r =r -C ;when 2:r =r *C ;when 3:                                      r =r /C ;break;}
        switch (op1) {case 0:r =A +r ;when 1:r =A -r ;when 2:r =A *r ;when 3:if (-0.01f<r  && r <0.01f) goto STEP4;r =A /r ;break;}
        switch (op3) {case 0:r =r +D ;when 1:r =r -D ;when 2:r =r *D ;when 3:                                      r =r /D ;break;}
        if (23.99f<r && r<24.01f) {N++;printf("%5d:  (%2d %c  (%2d  %c  %2d)) %c %2d  =24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

        //   A @ ((B  @  C)  @ D)
    STEP4:
        r=(float)B;
        switch (op2) {case 0:r =r +C ;when 1:r =r -C ;when 2:r =r *C ;when 3:                                      r =r /C ;break;}
        switch (op3) {case 0:r =r +D ;when 1:r =r -D ;when 2:r =r *D ;when 3:                                      r =r /D ;break;}
        switch (op1) {case 0:r =A +r ;when 1:r =A -r ;when 2:r =A *r ;when 3:if (-0.01f<r  && r <0.01f) goto STEP5;r =A /r ;break;}
        if (23.99f<r && r<24.01f) {N++;printf("%5d:   %2d %c ((%2d  %c  %2d)  %c %2d) =24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

        //   A @  (B  @ (C   @ D))
    STEP5:
        r=(float)C;
        switch (op3) {case 0:r =r +D ;when 1:r =r -D ;when 2:r =r *D ;when 3:                                      r =r /D ;break;}
        switch (op2) {case 0:r =B +r ;when 1:r =B -r ;when 2:r =B *r ;when 3:if (-0.01f<r  && r <0.01f) continue  ;r =B /r ;break;}
        switch (op1) {case 0:r =A +r ;when 1:r =A -r ;when 2:r =A *r ;when 3:if (-0.01f<r  && r <0.01f) continue  ;r =A /r ;break;}
        if (23.99f<r && r<24.01f) {N++;printf("%5d:   %2d %c  (%2d  %c (%2d   %c %2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
    }//op3
    }//op2
    }//op1
    }//D
    }//C
    }//B
    }//A
}
//运行结果:
//    1: (( 1 +    1) +   1)  *  8  =24
//    2:  ( 1 +  ( 1  +   1)) *  8  =24
//    3:  ( 1 +    1) * ( 1   + 11) =24
// ... ...
//53280:  (13 +   13) / (13   / 12) =24
//53281:  (13 -  (13  /  13)) + 12  =24
//53282:   13 - ((13  /  13)  - 12) =24


  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:24点游戏(1)