进阶实验2-3.2 用扑克牌计算24点 (25分)-穷举法

 

 解题思路:

 3个运算符,4个数字,2对括号,有5种组合方式

     ((a op b) op c) op d

     (a op (b op c)) op d

     a op ((b op c) op d)

     a op (b op (c op d))

     (a op b) op (c op d)

将每种模式写成函数,再穷举数字和运算符暴力求解,注意用浮点数运算

附:测试样例

2 3 12 12

5 5 5 5

1 3 5 6

8 13 9 4

2 13 7 7

5 5 5 2

#include <stdio.h>
char op[4]= {'+','-','*','/'};
float result(float x,float y,char op) {
    if(op=='+')
        return x+y;
    if(op=='-')
        return x-y;
    if(op=='*')
        return x*y;
    if(op=='/') 
        return x/y;
}
float model1(float a,float b,float c,float d,char op1,char op2,char op3) {
    float x,y,z;
    x=result(a,b,op1);
    y=result(x,c,op2);
    z=result(y,d,op3);
    return z;

}
float model2(float a,float b,float c,float d,char op1,char op2,char op3) {
    float x,y,z;
    x=result(b,c,op2);
    y=result(a,x,op1);
    z=result(y,d,op3);
    return z;

}
float model3(float a,float b,float c,float d,char op1,char op2,char op3) {
    float x,y,z;
    x=result(c,d,op3);
    y=result(b,x,op2);
    z=result(a,y,op1);
    return z;


}
float model4(float a,float b,float c,float d,char op1,char op2,char op3) {
    float x,y,z;
    x=result(b,c,op2);
    y=result(x,d,op3);
    z=result(a,y,op1);
    return z;

}
float model5(float a,float b,float c,float d,char op1,char op2,char op3) {
    float x,y,z;
    x=result(a,b,op1);
    y=result(c,d,op3);
    z=result(x,y,op2);
    return z;
}
int cal(int a,int b,int c,int d) {
    int i,j,k;
    int flag=0;
    for(i=0; i<4; i++) {
        for(j=0; j<4; j++) {
            for(k=0; k<4; k++) {
                char op1=op[i],op2=op[j],op3=op[k];
                if(model1(a,b,c,d,op1,op2,op3)==24) {
                    printf("((%d%c%d)%c%d)%c%d",a,op1,b,op2,c,op3,d);
                    flag=1;
                    break;
                }
                if(model2(a,b,c,d,op1,op2,op3)==24) {
                    printf("(%d%c(%d%c%d))%c%d",a,op1,b,op2,c,op3,d);
                    flag=1;
                    break;
                }
                if(model3(a,b,c,d,op1,op2,op3)==24) {
                    printf("%d%c(%d%c(%d%c%d))",a,op1,b,op2,c,op3,d);
                    flag=1;
                    break;
                }
                if(model4(a,b,c,d,op1,op2,op3)==24) {
                    printf("%d%c((%d%c%d)%c%d)",a,op1,b,op2,c,op3,d);
                    flag=1;
                    break;
                }
                if(model5(a,b,c,d,op1,op2,op3)==24) {
                    printf("(%d%c%d)%c(%d%c%d)",a,op1,b,op2,c,op3,d);
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            break;
    }
    if(flag)
        return 1;
    return 0;
}
int main() {
    int x[4];
    scanf("%d %d %d %d",&x[0],&x[1],&x[2],&x[3]);
    int i,j,k,t;
    int a,b,c,d;
    int flag=0;
    for(i=0; i<4; i++) {
        for(j=0; j<4; j++) {
            if(j==i)continue;
            for(k=0; k<4; k++) {
                if(k==i||k==j)continue;
                for(t=0; t<4; t++) {
                    if(t==i||t==j||t==k)continue;
                    int a=x[i];
                    int b=x[j];
                    int c=x[k];
                    int d=x[t];
                    flag=cal(a,b,c,d);
                    if(flag)
                        break;
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(flag)
            break;
    }
    if(!flag)
        printf("-1");
    return 0;
}

 

posted @ 2020-03-27 23:21  跃鱼  阅读(1498)  评论(0编辑  收藏  举报