算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;
}

  

posted @ 2013-03-24 10:42  萧凡客  阅读(175)  评论(0编辑  收藏  举报