luogu-1236 算24点
#include <cstdio>
char op[4]={'+','-','*','/'}; //+0 -1 *2 /3
int d[3][4],m[3][2],x[3],n[3];
bool v[3][4];
bool found=false;
bool printed=false;
void dfs(int k){
if(k==4){
if(n[2]!=24) return;
if(x[0]%2==0 && m[0][0]<m[0][1]) return;
if(x[1]%2==0 && m[1][0]<m[1][1]) return;
if(x[2]%2==0 && m[2][0]<m[2][1]) return;
found=true;
if(printed) return;
printed=true;
printf("%d%c%d=%d\n%d%c%d=%d\n%d%c%d=%d\n",
m[0][0],op[x[0]],m[0][1],n[0],
m[1][0],op[x[1]],m[1][1],n[1],
m[2][0],op[x[2]],m[2][1],n[2]);
return;
}
int t=k-1;
for(int i=0;i<4-t;i++) {
if(v[t][i]) continue;
m[t][1]=d[t][i]; v[t][i]=true;
for(int j=0;j<4;j++) {
x[t]=j;
if(j==0) { n[t]=m[t][0]+m[t][1]; }
else if(j==1 && m[t][0]>=m[t][1]) { n[t]=m[t][0]-m[t][1]; }
else if(j==2) { n[t]=m[t][0]*m[t][1]; }
else if(j==3 && m[t][1]>0 && m[t][0]%m[t][1]==0) { n[t]=m[t][0]/m[t][1]; }
else { continue; }
if(k==3) { dfs(k+1); continue; }
d[k][0]=n[t];
for(int h=0,g=1;h<4-t;h++) { if(v[t][h]) continue; d[k][g++]=d[t][h]; }
// for(int h=0;h<4-k;h++) { printf("%d ",d[k][h]); } printf("\n");
for(int h=0;h<4-k;h++) { m[k][0]=d[k][h]; v[k][h]=true; dfs(k+1); m[k][0]=0; v[k][h]=false; }
}
m[t][1]=0; v[t][i]=false;
}
}
int main(){
for(int i=0;i<4;i++) scanf("%d",&d[0][i]);
for(int i=0;i<4;i++) { m[0][0]=d[0][i]; v[0][i]=true; dfs(1); m[0][0]=0; v[0][i]=false; }
if(!found) printf("No answer!\n");
return 0;
}