算24
#include<stdio.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 char sz[8]=" +-*/"; int list[25][5],map[5][5],visit[5],t,pp[5]; char z[400]; double two(double a,int f,double b) { switch(f) { case 1: { return a+b; break; } case 2: { return a-b; break; } case 3: { return a*b; break; } case 4: { return a/b; break; } } } int pan(char *x,double a,double b,double c,int f1,int f2) { //printf("%s a = %.0lf b= %.0lf c= %.0lf %c %c/n",x,a,b,c,sz[f1],sz[f2]); double xy=two(a,f1,two(b,f2,c)); //printf("---%.0lf/n",xy); if(24.0==xy) { //printf("ppp %.0lf/n",DIAN); sprintf(z,"%s%c(%.0lf%c%.0lf)",x,sz[f1],b,sz[f2],c); return 1; } else return 0; } int four(double *a,int *f)//3个符号 四个操作数 { char x[200],y[200]; double b[3],hou[2]; //if(f[0]==1||f[0]==2) { sprintf(x,"(%.0lf%c%.0lf)",a[0],sz[f[0]],a[1]); } b[0]=two(a[0],f[0],a[1]); if(b[0]<0) { b[0]=-b[0]; sprintf(x,"(%.0lf%c%.0lf)",a[1],sz[f[0]],a[0]); } //if(f[1]==1||f[1]==2) { sprintf(y,"(%s%c%.0lf)",x,sz[f[1]],a[2]); } b[1]=two(b[0],f[1],a[2]); // printf("%.0lf %s",b[1],y); if(b[1]<0) { b[1]=-b[1]; sprintf(y,"(%.0lf%c%s)",a[2],sz[f[1]],x); } // if(f[2]==1||f[2]==2) { sprintf(z,"(%s%c%.0lf)",y,sz[f[2]],a[3]); } b[2]=two(b[1],f[2],a[3]); if(b[2]<0) { b[2]=-b[2]; sprintf(z,"(%.0lf%c%s)",a[3],sz[f[2]],y); } //printf("-----%.0lf----/n",b[2]); if(b[2]==24.0) { //printf("xxx"); return OK; } else { if(pan(x,b[0],a[2],a[3],f[1],f[2])) { return OK; } else return ERROR; } } void cal(int r,int j) { if(r<4) { for(int i=0;i<4;i++) { if(!visit[i]) {//printf("11111"); visit[i]=1; pp[j]=map[r][i]; cal(r+1,j+1); visit[i]=0; } } } else { for(int k=0;k<4;k++) list[t][k]=pp[k]; t++; } } int main() { int a,b,c,d,ttt=0; int i,j,k,l,kt,flag; int ft[3]; double at[4]; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF) { ttt++; t=0; flag=1; for( i=0;i<4;i++) { map[i][0]=a; map[i][1]=b; map[i][2]=c; map[i][3]=d; } cal(0,0); // printf("t = %d/n",t); printf("Case %d:/n",ttt); /* for(i=0;i<24;i++) { for(j=0;j<4;j++) printf("%d ",list[i][j]); printf("/n"); } system("pause");*/ for(i=0;i<t&&flag;i++) {for(kt=0;kt<4;kt++) at[kt]=list[i][kt]; for(j=1;j<=4&&flag;j++) for(k=1;k<=4&&flag;k++) for(l=1;l<=4&&flag;l++) { ft[0]=j;ft[1]=k;ft[2]=l; if(four(at,ft)) { printf("%s/n",z); flag=0; break; } } } if(flag) { printf("No Solution!/n"); } } return 0; }