• PKU 3983


    很久前写了一个24点的算法,刚好POJ上也有个24点,顺便给解了,POJ上的相对于我原始来写的较为简单许多,因为,限制了数字的位置固定,实际上24点的话是不可能限制这个固定的,所以我之前会对数据进行一次排列,4个数据,按照位置不同的话就会有24种排列4*3*2*1 ,这个算法因为位置固定,而且只需要求一个解就可以,总体来说简单不少,下面贴代码

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int fun3(double a,double b,double c,double d) // a t (b t (c t d)) 
    {
        
        int i,j,k;
        double temp1,temp2,result1,result2;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                {
                    switch(i)
                    {
                    case 0: temp1=c+d;
                        break;
                    case 1:temp1=c-d;
                        break;
                    case 2:temp1=c*d;
                        break;
                    case 3:temp1=c/d;
                        break;
                    }
                    switch(j)
                    {
                    case 0: temp2=b+temp1;
                        break;
                    case 1:temp2=b-temp1;
                        break;
                    case 2:temp2=b*temp1;
                        break;
                    case 3:temp2=b/temp1;
                        break;
                    }
                    switch(k)
                    {
                    case 0: result1=a+temp2;
                        break;
                    case 1:result1=a-temp2;
                        break;
                    case 2:result1=a*temp2;
                        break;
                    case 3:result1=a/temp2;
                        break;
                    }        
                    result2=  (result1);
                    if(  (result2-24)>-0.00001&&  (result2-24)<0.00001)
                    {    
                        char e,f,g;
                        switch(i)
                        {
                        case 0:e='+';
                            break;
                        case 1:e='-';
                            break;
                        case 2:e='*';
                            break;
                        case 3:e='/';
                            break;
                        }
                        switch(j)
                        {
                        case 0:f='+';
                            break;
                        case 1:f='-';
                            break;
                        case 2:f='*';
                            break;
                        case 3:f='/';
                            break;
                        }
                        switch(k)
                        {
                        case 0 : g='+';
                            break;
                        case 1:g='-';
                            break;
                        case 2:g='*';
                            break;
                        case 3:g='/';
                            break;
                        }
                        
                        cout<<a<<g<<"("<<b<<f<<"("<<c<<e<<d<<")"<<")"<<endl;
                        return 1;
                    }
                }
                return 0;
                
    }
    int fun22(double a,double b,double c,double d) //a t ((b t c) t d)
    {
    
        int i,j,k;
        double temp1,temp2,result1,result2;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                {
                    switch(i)
                    {
                    case 0: temp1=b+c;
                        break;
                    case 1:temp1=b-c;
                        break;
                    case 2:temp1=b*c;
                        break;
                    case 3:temp1=b/c;
                        break;
                    }
                    switch(j)
                    {
                    case 0: temp2=temp1+d;
                        break;
                    case 1:temp2=temp1-d;
                        break;
                    case 2:temp2=temp1*d;
                        break;
                    case 3:temp2=temp1/d;
                        break;
                    }
                    switch(k)
                    {
                    case 0: result1=a+temp2;
                        break;
                    case 1:result1=a-temp2;
                        break;
                    case 2:result1=a*temp2;
                        break;
                    case 3:result1=a/temp2;
                        break;
                    }        
                    result2=  (result1);
                    if(  (result2-24)>-0.00001&&  (result2-24)<0.00001)
                    {    
                        char e,f,g;
                        switch(i)
                        {
                        case 0:e='+';
                            break;
                        case 1:e='-';
                            break;
                        case 2:e='*';
                            break;
                        case 3:e='/';
                            break;
                        }
                        switch(j)
                        {
                        case 0:f='+';
                            break;
                        case 1:f='-';
                            break;
                        case 2:f='*';
                            break;
                        case 3:f='/';
                            break;
                        }
                        switch(k)
                        {
                        case 0 : g='+';
                            break;
                        case 1:g='-';
                            break;
                        case 2:g='*';
                            break;
                        case 3:g='/';
                            break;
                        }
    
                        cout<<a<<g<<"("<<"("<<b<<e<<c<<")"<<f<<d<<")"<<endl;
                        return 1;
                    }
                }
                return 0;
    
    }
    int fun2(double a,double b,double c,double d) //(a t (b t c)) t d
    {
        
        int i,j,k;
        double temp1,temp2,result1,result2;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                {
                    switch(i)
                    {
                    case 0: temp1=b+c;
                        break;
                    case 1:temp1=b-c;
                        break;
                    case 2:temp1=b*c;
                        break;
                    case 3:temp1=b/c;
                        break;
                    }
                    switch(j)
                    {
                    case 0: temp2=a+temp1;
                        break;
                    case 1:temp2=a-temp1;
                        break;
                    case 2:temp2=a*temp1;
                        break;
                    case 3:temp2=a/temp1;
                        break;
                    }
                    switch(k)
                    {
                    case 0: result1=temp2+d;
                        break;
                    case 1:result1=temp2-d;
                        break;
                    case 2:result1=temp2*d;
                        break;
                    case 3:result1=temp2/d;
                        break;
                    }        
                    result2=  (result1);
                    if(  (result2-24)>-0.00001&&  (result2-24)<0.00001)
                    {    
                        char e,f,g;
                        switch(i)
                        {
                        case 0:e='+';
                            break;
                        case 1:e='-';
                            break;
                        case 2:e='*';
                            break;
                        case 3:e='/';
                            break;
                        }
                        switch(j)
                        {
                        case 0:f='+';
                            break;
                        case 1:f='-';
                            break;
                        case 2:f='*';
                            break;
                        case 3:f='/';
                            break;
                        }
                        switch(k)
                        {
                        case 0 : g='+';
                            break;
                        case 1:g='-';
                            break;
                        case 2:g='*';
                            break;
                        case 3:g='/';
                            break;
                        }
                        
                        cout<<"("<<a<<f<<"("<<b<<e<<c<<")"<<")"<<g<<d<<endl;
                        return 1;
                    }
                }
                return 0;
                
    }
    int fun1(double a,double b,double c,double d) //(a t b)t(c t d)
    {
        
        int i,j,k;
        double temp1,temp2,result1,result2;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                {
                    switch(i)
                    {
                    case 0: temp1=a+b;
                        break;
                    case 1:temp1=a-b;
                        break;
                    case 2:temp1=a*b;
                        break;
                    case 3:temp1=a/b;
                        break;
                    }
                    switch(j)
                    {
                    case 0: temp2=c+d;
                        break;
                    case 1:temp2=c-d;
                        break;
                    case 2:temp2=c*d;
                        break;
                    case 3:temp2=c/d;
                        break;
                    }
                    switch(k)
                    {
                    case 0: result1=temp1+temp2;
                        break;
                    case 1:result1=temp1-temp2;
                        break;
                    case 2:result1=temp1*temp2;
                        break;
                    case 3:result1=temp1/temp2;
                        break;
                    }        
                    result2=  (result1);
                    if(  (result2-24)>-0.00001&&  (result2-24)<0.00001)
                    {    
                        char e,f,g;
                        switch(i)
                        {
                        case 0:e='+';
                            break;
                        case 1:e='-';
                            break;
                        case 2:e='*';
                            break;
                        case 3:e='/';
                            break;
                        }
                        switch(j)
                        {
                        case 0:f='+';
                            break;
                        case 1:f='-';
                            break;
                        case 2:f='*';
                            break;
                        case 3:f='/';
                            break;
                        }
                        switch(k)
                        {
                        case 0 : g='+';
                            break;
                        case 1:g='-';
                            break;
                        case 2:g='*';
                            break;
                        case 3:g='/';
                            break;
                        }
                        
                        cout<<"("<<a<<e<<b<<")"<<g<<"("<<c<<f<<d<<")"<<endl;
                        return 1;
                    }
                }
                return 0;
                
    }
    int fun(double a,double b,double c,double d) //((a t b) t c) t d
    {
        
        int i,j,k;
        double temp1,temp2,result1,result2;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                for(k=0;k<4;k++)
                {
                    switch(i)
                    {
                    case 0: temp1=a+b;
                        break;
                    case 1:temp1=a-b;
                        break;
                    case 2:temp1=a*b;
                        break;
                    case 3:temp1=a/b;
                        break;
                    }
                    switch(j)
                    {
                    case 0: temp2=temp1+c;
                        break;
                    case 1:temp2=temp1-c;
                        break;
                    case 2:temp2=temp1*c;
                        break;
                    case 3:temp2=temp1/c;
                        break;
                    }
                    switch(k)
                    {
                    case 0: result1=temp2+d;
                        break;
                    case 1:result1=temp2-d;
                        break;
                    case 2:result1=temp2*d;
                        break;
                    case 3:result1=temp2/d;
                        break;
                    }        
                    result2=  (result1);
                    if(  (result2-24)>-0.00001&&  (result2-24)<0.00001)
                    {    
                        char e,f,g;
                        switch(i)
                        {
                        case 0:e='+';
                            break;
                        case 1:e='-';
                            break;
                        case 2:e='*';
                            break;
                        case 3:e='/';
                            break;
                        }
                        switch(j)
                        {
                        case 0:f='+';
                            break;
                        case 1:f='-';
                            break;
                        case 2:f='*';
                            break;
                        case 3:f='/';
                            break;
                        }
                        switch(k)
                        {
                        case 0 : g='+';
                            break;
                        case 1:g='-';
                            break;
                        case 2:g='*';
                            break;
                        case 3:g='/';
                            break;
                        }
                        
                        cout<<"("<<"("<<a<<e<<b<<")"<<f<<c<<")"<<g<<d<<endl;
                        return 1;
                    }
                }
                return 0;
                
    }
    int can24(int a,int b,int c,int d)
    {
        int res=0;
        res= fun(a,b,c,d);
        if(res==1)return res;
        res= fun1(a,b,c,d);
        if(res==1)return res;
        res= fun2(a,b,c,d);
        if(res==1)return res;
        res= fun22(a,b,c,d);
        if(res==1)return res;
        res= fun3(a,b,c,d);
        if(res==1)return res;
    
        return res;
    }
    int main(int  argc, char* args[])
    {
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        int res=can24(a,b,c,d);
        return 0;
    };

    比较笨,只会用穷举 。根据计算优先级 会有以下5种 t表示符号

    ((a t b)t c) t d      (a t b) t (c t d)     a t ((b t c) t d)       (a t (b t c)) t d  a t ((b t c) t d)  每种都写了一个函数 

  • 相关阅读:
    JS Number(),parseInt(),parseFloat()
    html5+css3+js实现贪吃蛇游戏功能
    通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
    .NET core实现一个简易的事件协调器(saga)
    阿里云搭建k8s高可用集群(1.17.3)
    k8s单master集群通过备份etcd还原集群
    个人笔记快速搭建k8s1.16.0
    .netcore下的微服务、容器、运维、自动化发布
    KubeSphere2.1踩坑记
    通过Dapr实现一个简单的基于.net的微服务电商系统
  • 原文地址:https://www.cnblogs.com/alphaxz/p/3480732.html
Copyright © 2020-2023  润新知