Coding Change World

代码改变世界
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)  每种都写了一个函数 

posted on 2013-12-18 17:24  alphaxz  阅读(232)  评论(0编辑  收藏  举报