回 帖 发 新 帖 刷新版面

主题:[讨论]求24点算法

高手门。谁会24点算法?除了穷举就没有别的算法了吗?

回复列表 (共9个回复)

沙发

C语言区的雨中飞燕有程序,请教一下她吧

板凳


我不知道怎么找她啊。

3 楼

我想到的也是穷举.反正所有的情况又不多,给你个程序,我大一的时候学C语言编的.#include<stdio.h>
#include<math.h>
int flag=0;
void calculate(float a,float b,float *p)
{
  *(p++)=a+b;
  *(p++)=a-b;
  *(p++)=b-a;
  *(p++)=a*b;
  if(b!=0)
    *(p++)=a/b;
  else *(p++)=20027;
  if(a!=0)
     *(p)=b/a;
  else *p=20027;
}
void function (float a,float b,float c,float d)
{
   float a1[6]={0},a2[6]={0},result[6]={0};
   int i,j,k;
   calculate(a,b,a1);
   calculate(c,d,a2);
   for(i=0;i<6;i++)
   for(j=0;j<6;j++)
   {
     calculate(a1[i],a2[j],result);
     for(k=0;k<6;k++)
       if(fabs((double)24-result[k])<1e-3)
         {
           switch(i)
           {
             case 0:printf("%.0f+%.0f=%.0f\n",a,b,a1[0]);break;
             case 1:printf("%.0f-%.0f=%.0f\n",a,b,a1[1]);break;
             case 2:printf("%.0f-%.0f=%.0f\n",b,a,a1[2]);break;
             case 3:printf("%.0f*%.0f=%.0f\n",a,b,a1[3]);break;
             case 4:printf("%.0f/%.0f=%g\n",a,b,a1[4]);break;
             case 5:printf("%.0f/%.0f=%g\n",b,a,a1[5]);break;
           }
           switch(j)
           {
             case 0:printf("%.0f+%.0f=%.0f\n",c,d,a2[0]);break;
             case 1:printf("%.0f-%.0f=%.0f\n",c,d,a2[1]);break;
             case 2:printf("%.0f-%.0f=%.0f\n",d,c,a2[2]);break;
             case 3:printf("%.0f*%.0f=%.0f\n",c,d,a2[3]);break;
             case 4:printf("%.0f/%.0f=%g\n",c,d,a2[4]);break;
             case 5:printf("%.0f/%.0f=%g\n",d,c,a2[5]);break;
           }
           switch(k)
           {
             case 0:printf("%g+%g=%g\n",a1[i],a2[j],result[0]);break;
             case 1:printf("%g-%g=%g\n",a1[i],a2[j],result[1]);break;
             case 2:printf("%g-%g=%g\n",a2[j],a1[i],result[2]);break;
             case 3:printf("%g*%g=%g\n",a1[i],a2[j],result[3]);break;
             case 4:printf("%g/%g=%g\n",a1[i],a2[j],result[4]);break;
             case 5:printf("%g/%g=%g\n",a2[j],a1[i],result[5]);break;
           }
           flag=1;/*标记已计算出来*/
           i=6;
           j=6;
           break;
         }
   }
   if(flag==0)
     {
       for(i=0;i<6;i++)
         {
           calculate(a1[i],c,a2);
           for(j=0;j<6;j++)
             {
              calculate(a2[j],d,result);
              for(k=0;k<6;k++)
                if(fabs(24-result[k])<0.001)
                 {
                   switch(i)
           {
             case 0:printf("%.0f+%.0f=%.0f\n",a,b,a1[0]);break;
             case 1:printf("%.0f-%.0f=%.0f\n",a,b,a1[1]);break;
             case 2:printf("%.0f-%.0f=%.0f\n",b,a,a1[2]);break;
             case 3:printf("%.0f*%.0f=%.0f\n",a,b,a1[3]);break;
             case 4:printf("%.0f/%.0f=%g\n",a,b,a1[4]);break;
             case 5:printf("%.0f/%.0f=%g\n",b,a,a1[5]);break;
           }
           switch(j)
           {
             case 0:printf("%g+%.0f=%g\n",a1[i],c,a2[0]);break;
             case 1:printf("%g-%.0f=%g\n",a1[i],c,a2[1]);break;
             case 2:printf("%.0f-%g=%g\n",c,a1[i],a2[2]);break;
             case 3:printf("%g*%.0f=%g\n",a1[i],c,a2[3]);break;
             case 4:printf("%g/%.0f=%g\n",a1[i],c,a2[4]);break;
             case 5:printf("%.0f/%g=%g\n",c,a1[i],a2[5]);break;
           }

4 楼

switch(k)
           {
             case 0:printf("%g+%.0f=%g\n",a2[j],d,result[0]);break;
             case 1:printf("%g-%.0f=%g\n",a2[j],d,result[1]);break;
             case 2:printf("%.0f-%g=%g\n",d,a2[j],result[2]);break;
             case 3:printf("%g*%.0f=%g\n",a2[j],d,result[3]);break;
             case 4:printf("%g/%.0f=%g\n",a2[j],d,result[4]);break;
             case 5:printf("%.0f/%g=%g\n",d,a2[j],result[5]);break;
           }
                   flag=1;/*标记已计算出来*/
                   i=6;
                   j=6;
                   break;
                 }
             }
         }
       if(flag==0)
        {
           for(i=0;i<6;i++)
            {
              calculate(a1[i],d,a2);
              for(j=0;j<6;j++)
                {
                   calculate(a2[j],c,result);
                   for(k=0;k<6;k++)
                     if(fabs(24-result[k])<0.001)
                      {
                         switch(i)
           {
             case 0:printf("%.0f+%.0f=%.0f\n",a,b,a1[0]);break;
             case 1:printf("%.0f-%.0f=%.0f\n",a,b,a1[1]);break;
             case 2:printf("%.0f-%.0f=%.0f\n",b,a,a1[2]);break;
             case 3:printf("%.0f*%.0f=%.0f\n",a,b,a1[3]);break;
             case 4:printf("%.0f/%.0f=%g\n",a,b,a1[4]);break;
             case 5:printf("%.0f/%.0f=%g\n",b,a,a1[5]);break;
           }
           switch(j)
           {
             case 0:printf("%g+%.0f=%g\n",a1[i],d,a2[0]);break;
             case 1:printf("%g-%.0f=%g\n",a1[i],d,a2[1]);break;
             case 2:printf("%.0f-%g=%g\n",d,a1[i],a2[2]);break;
             case 3:printf("%g*%.0f=%g\n",a1[i],d,a2[3]);break;
             case 4:printf("%g/%.0f=%g\n",a1[i],d,a2[4]);break;
             case 5:printf("%.0f/%g=%g\n",d,a1[i],a2[5]);break;
           }
           switch(k)
           {
             case 0:printf("%g+%.0f=%g\n",a2[j],c,result[0]);break;
             case 1:printf("%g-%.0f=%g\n",a2[j],c,result[1]);break;
             case 2:printf("%.0f-%g=%g\n",c,a2[j],result[2]);break;
             case 3:printf("%g*%.0f=%g\n",a2[j],c,result[3]);break;
             case 4:printf("%g/%.0f=%g\n",a2[j],c,result[4]);break;
             case 5:printf("%.0f/%g=%g\n",c,a2[j],result[5]);break;
           }
                         flag=1;
                         i=6;
                         j=6;
                         break;
                      }
                }
            }
        }
     }
}
main()
{
  float a,b,c,d;
  printf("Please input four number between 1-12:\n");
  scanf("%f%f%f%f",&a,&b,&c,&d);
  function(a,b,c,d);
  if(!flag)
    {
     function(b,c,a,d);
     if(!flag)
      {
        function(c,d,a,b);
        if(!flag)
         {
           function(a,d,b,c);
           if(!flag)
            {
             function(a,c,b,d);
             if(!flag)
                function(b,d,a,c);
            }
         }
      }
    }
  if(!flag)
     printf("Sorry,the four number can't be calculated out!");
  return 0;
}

5 楼

写得很是累赘,不好意思。当时刚学C语言,糊里糊涂的.

6 楼


没有注释的 好难理解

7 楼

#define     N  4
float cun[N-1][3];
int q=0 ;
    
float f(const int b,const float m,const float n)
{
    float c ;
    if(b==1) c=m+n ;
    else if(b==2) c=m-n ;
    else if(b==3) c=m*n ;
    else if(b==4&&n!=0) c=m/n ;
    else  c=-1000 ;
    return(c);
}
int work(const float a[],int b1[],int count,int p)
{
   int i,j,way ;  
    int b2[N]= {0} ;
    float c[N];
    if(p==0)
    {
        if(fabs(a[0]-24)<1e-5) q=1 ;
        return 0 ;
    }
    
    if(count==-1)
    {
        for(way=1;way<5;way++)
        {
            for(i=0;i<p+1;i++)
            if(i==0)
            {
                if(way==4&&a[b1[1]-1]==0) goto end ;
                c[i]=f(way,a[b1[0]-1],a[b1[1]-1]);
            }
            else c[i]=a[b1[i+1]-1];
            
            work(c,b1,p-1,p-1);
            if(q==1)  /* q==1 表示有正确答案 */
            {
                cun[N-p-1][0]=(float)way ;
                cun[N-p-1][1]=a[b1[0]-1];
                cun[N-p-1][2]=a[b1[1]-1];
                return 0 ;
            }
            end : ;
        }
    }
    
    for(j=1;j<=p+1;j++)
    {
        for(i=0;i<N;i++) b2[i]=b1[i];
        for(i=count+1;i<=p;i++)
        if(b1[i]==j)  goto point ;
        b2[count]=j ;
        work(a,b2,count-1,p);
        if(q==1) return 0 ;
        point : ;
    }
}这个 好象能符合你的要求  算24点的

8 楼


辛苦你了。没有功劳也有苦劳。谢谢了。

9 楼


我先看一看再给你评分。谢谢了。辛苦啊。

我来回复

您尚未登录,请登录后再回复。点此登录或注册