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

      

  • 相关阅读:
    Unix IPC之共享内存区(1)
    linux下的二进制文件的编辑和查看
    Posix 信号量
    Unix IPC之Posix信号量实现生产者消费者
    整型信号量与记录型信号量
    C++之友元
    C++之异常处理
    C++之STL(标准模板库)
    C++之继承
    C++之封装
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/2978210.html
Copyright © 2020-2023  润新知