zoukankan      html  css  js  c++  java
  • 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)  每种都写了一个函数 

  • 相关阅读:
    焦点的相关属性和方法
    laravel 环境配置
    fetch body里数据为ReadableStream 解决办法
    解决NodeJS+Express模块的跨域访问控制问题:Access-Control-Allow-Origin
    mongo启动
    react-native android 打包发布
    delphi 还原窗口
    窗口还原
    款式修改窗口,开发调整过窗口格局保存功能,关了窗口重新打开还是按关闭前的格局.
    希尔排序算法
  • 原文地址:https://www.cnblogs.com/alphaxz/p/3480732.html
Copyright © 2011-2022 走看看