算24 (穷举法)

使用穷举法代码很长,期待学到更好的算法(我想应该用递归吧)微笑

#include <stdio.h>

#include <stdlib.h>
#include <math.h>

double add(double x ,double y)
{
    return x+y;
}    
double mul(double x,double y)
{
    return x*y;
}
double sub1(double x,double y)
{
    return x-y;    
}        
double sub2(double x,double y)
{
    return y-x;
}    
double chu1(double x,double y)
{
    return x/y;
}
double chu2(double x,double y)
{
    return y/x;   
}    
double a[4];
typedef double (*ptrFunc)(double,double);
ptrFunc p[6];  //函数指针数组
double resu=0;
bool compute()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(j==i) continue;
            for(int k=0;k<6;k++)
            {
                if(k==4 && a[j]==0) continue;
                if(k==5 && a[i]==0) continue;
                resu=p[k](a[i],a[j]);//两个数运算的结果
                double temp2=resu;
                double x,y;
                int ii,jj;
                for(ii=0;ii<4;ii++)
                {
                    if(ii!=i&&ii!=j) { x = a[ii];break;}
                }    
                for(jj=ii+1;jj<4;jj++)
                {
                    if(jj!=i&&jj!=j) { y = a[jj];break;}
                }
                double resu2;
                for(int q=0;q<6;q++)
                {
                    if(q==4&&y==0) continue;
                    if(q==5&&x==0) continue;
                    resu2=p[q](x,y);//另两个数的运算结果
                       
                    for(int t=0;t<6;t++)
                    {
                       if(t==4 && resu2==0) continue;
                       if(t==5 && temp2==0) continue;
                       resu=p[t](temp2,resu2);
                       if(fabs(resu-24.0)<1e-6) return true;
                   }    
                }   
                 
                for(int m=0;m<4;m++)
                {
                    if(m==i||m==j)continue;
                    
                    for(int q=0;q<6;q++)
                    {
                        if(q==4 && a[m]==0) continue;
                        if(q==5 && temp2==0) continue;
                        resu=p[q](temp2,a[m]);
                        double temp=resu;//三个数的运算结果
                        for(int n=0;n<4;n++)
                        {
                           if(n==i||n==j||n==m) continue;
                           
                           for(int t=0;t<6;t++)
                           {
                               if(t==4 && a[n]==0) continue;
                               if(t==5 && temp==0) continue;
                               resu=p[t](temp,a[n]);        //三个数与另外一个数的运算结果                     
                               if(fabs(resu-24.0)<1e-6) return true;
                           }          
                        }
                    }           
                }  
            }      
        }    
    }
    return false;   
}        
int main()
{  
    p[0]=add;p[1]=mul;p[2]=sub1;p[3]=sub2;p[4]=chu1;p[5]=chu2;
    
    while(1)
    {
        scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3]);
        if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0) break;
        
        if(compute()) printf("YES\n");
        else printf("NO\n");
      
    }    
    return 0;
}   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值