题解 P1236 【算24点】

· · 题解

这题可以dfs全排列然后枚举运算符

总觉得这样比dfs运算符好理解qwq

先dfs出全排列,存到另一个二维数组里,然后枚举三个运算符,判断结果

注意要加上后一个数对前一个数操作的情况

上代码↓

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const char ch[7]={0,'+','-','*','/','-','/'};

int a[5],c[25][5],k[5];
bool vis[5];

void dfs(int num,int tp)
{
    if(tp==4){
        ++c[0][0];
        for(int i=1;i<=4;++i){
            c[c[0][0]][i]=k[i];
        }return;
    }for(int i=1;i<=4;++i){
        if(!vis[i]){
            vis[i]=1;
            k[tp+1]=a[i];
            dfs(i,tp+1);
            vis[i]=0;
        }
    }return;
}

int main()
{
    scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]);
    for(int i=1;i<=4;++i){
        vis[i]=1;
        k[1]=a[i];
        dfs(i,1);
        vis[i]=0;
    }for(int i=1;i<=c[0][0];++i){
        for(int j=1;j<=6;++j){
            for(int k=1;k<=6;++k){
                for(int l=1;l<=6;++l){
                    int a1,a2,a3;
                    if(j==1) a1=c[i][1]+c[i][2];
                    else if(j==2&&c[i][1]>c[i][2]) a1=c[i][1]-c[i][2];
                    else if(j==3) a1=c[i][1]*c[i][2];
                    else if(j==4&&c[i][1]%c[i][2]==0) a1=c[i][1]/c[i][2];
                    else if(j==5&&c[i][2]>c[i][1]) a1=c[i][2]-c[i][1];
                    else if(j==6&&c[i][2]%c[i][1]==0) a1=c[i][2]/c[i][1];
                    else continue;
                    if(k==1) a2=a1+c[i][3];
                    else if(k==2&&a1>c[i][3]) a2=a1-c[i][3];
                    else if(k==3) a2=a1*c[i][3];
                    else if(k==4&&a1%c[i][3]==0) a2=a1/c[i][3];
                    else if(k==5&&c[i][3]>a1) a2=c[i][3]-a1;
                    else if(k==6&&c[i][3]%a1==0) a2=c[i][3]/a1;
                    else continue;
                    if(l==1) a3=a2+c[i][4];
                    else if(l==2&&a2>c[i][4]) a3=a2-c[i][4];
                    else if(l==3) a3=a2*c[i][4];
                    else if(l==4&&a2%c[i][4]==0) a3=a2/c[i][4];
                    else if(l==5&&c[i][4]>a2) a3=c[i][4]-a2;
                    else if(l==6&&c[i][4]%a2==0) a3=c[i][4]/a2;
                    if(a3==24){
                        printf("%d%c%d=%d\n",max(c[i][1],c[i][2]),ch[j],min(c[i][1],c[i][2]),a1);
                        printf("%d%c%d=%d\n",max(a1,c[i][3]),ch[k],min(a1,c[i][3]),a2);
                        printf("%d%c%d=%d\n",max(a2,c[i][4]),ch[l],min(a2,c[i][4]),a3);
                        return 0;
                    }
                }
            }
        }
    }puts("No answer!");
    return 0;
}