回 帖 发 新 帖 刷新版面

主题:[讨论]24点全解搞定

以下是我写的24点问题的算法,恳请指教!
Uc :hqsatnet



#include <stdio.h>
#include <math.h>
int num[4];
int numlow[24][4] ={0,1,2,3,     /* 1******  numlow为num下标  ****/
                    0,2,1,3,     /* 2*/
                    1,0,2,3,     /* 3*/
                    1,2,0,3,     /* 4*/
                    2,0,1,3,     /* 5*/
                    2,1,0,3,     /* 6*/
                    0,1,3,2,     /* 7*/
                    0,2,3,1,     /* 8*/
                    1,0,3,2,     /* 9*/
                    1,2,3,0,     /* 10*/
                    2,0,3,1,     /* 11*/
                    2,1,3,0,     /* 12*/
                    0,3,1,2,     /* 13*/
                    0,3,2,1,     /* 14*/
                    1,3,0,2,     /* 15*/
                    1,3,2,0,     /* 16*/
                    2,3,0,1,     /* 17*/
                    2,3,1,0,     /* 18*/
                    3,0,1,2,     /* 19*/
                    3,0,2,1,     /* 20*/
                    3,1,0,2,     /* 21*/
                    3,1,2,0,     /* 22*/
                    3,2,0,1,     /* 23*/
                    3,2,1,0};    /* 24*/




main()
{
float calculate (float num1,float num2,int n);
char sign (int n);

loop:
scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]);


/*****  计算  ******/
for (int m=0;m<24;m++)         /*****  遍历所有排列  *****/
    {
    for (int k=1;k<7;k++)        /*******  遍历所有运算方式   *******/
        {
        for (int j=1;j<7;j++)     /*******  遍历所有运算方式   *******/
            {
            for (int i=1;i<7;i++)    /*******  遍历所有运算方式   *******/
                {
                if(fabs(calculate (calculate (calculate (                          /******  计算 ((A★B)★C)★D  类型***/
                     float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
                    ,float(num[numlow[m][2]]),j)
                    ,float(num[numlow[m][3]]),k) - 24)<0.01)
                    printf ("((%d %c %d) %c %d) %c %d\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (j),num[numlow[m][2]],sign (k),num[numlow[m][3]]);

                if(fabs(calculate (                                                    /****  计算  (A★B)★(C★D)  类型******/
                    calculate (float(num[numlow[m][0]]),float(num[numlow[m][1]]),i)
                    ,calculate (float(num[numlow[m][2]]),float(num[numlow[m][3]]),j)
                    ,k) - 24)<0.01)
                    printf ("(%d %c %d) %c (%d %c %d)\n",num[numlow[m][0]],sign (i),num[numlow[m][1]],sign (k),num[numlow[m][2]],sign (j),num[numlow[m][3]]);
                    
                }
            }
        }
    }
goto loop;
}


/*****  计算  ******/
float calculate (float num1,float num2,int n)   /****  n指定运算方式  *****/
{
if(num1==0) num1=0.00001;         /*****  避免除数为零  ****/
if(num2==0) num2=0.00001;

switch(n)
    {
    case 1: return (num1+num2);
    case 2: return (num1-num2);
    case 3: return (num2-num1);
    case 4: return (num1*num2);
    case 5: return (num1/num2);
    case 6: return (num2/num1);
    }
}





/****  输出  ****/
char sign (int n)
{
switch(n)
    {
    case 1: return ('+'); break;
    case 2: return ('-'); break;
    case 3: return ('~'); break;        /****  ~表示反减 *****/
    case 4: return ('*'); break;
    case 5: return ('/'); break;
    case 6: return ('\\'); break;        /******  \表示反除  ********/
    }

}






















回复列表 (共1个回复)

沙发

#include<conio.h>
#include<math.h>
#include<conio.h>
#include<string.h>

char sig[4]={'+','-','*','/'};

void fun(float n[],char ch[][50],int m)
{
int x[2],y,i,j;
float num[4];
char cc[4][50];
if(m==1)
{
    if(fabs(n[0]-24.0)<0.0001)
    {
        printf("\n%s=24",ch[0]);
        getch();
        exit(0);
    }
}
else
{
   for(x[0]=0;x[0]<m;x[0]++)
   {
      for(x[1]=0;x[1]<m;x[1]++)
      {
         if(x[1]==x[0])continue;
         for(y=0;y<4;y++)
         {
           switch(y)
           {
        case 0: num[0]=n[x[0]]+n[x[1]];break;
        case 1: num[0]=n[x[0]]-n[x[1]];break;
        case 2: num[0]=n[x[0]]*n[x[1]];break;
        case 3: if(n[x[1]]==0)break;
            num[0]=n[x[0]]/n[x[1]];break;
            default:break;
       }
       if(y!=3||n[x[1]]!=0)
         sprintf(cc[0],"(%s%c%s)",ch[x[0]],sig[y],ch[x[1]]);
       for(i=0,j=1;i<m;i++)
              if(i!=x[0]&&i!=x[1])
              {
                 num[j]=n[i];
         strcpy(cc[j],ch[i]);
                 j++;
              }
       fun(num,cc,m-1);
         }
       }
     }
  }
}

/***********************/
main()
{
  float num[4];
  int i;
  char cx[4][50];

  clrscr();
  printf("Please input 4 integers:");
  for(i=0;i<4;i++)
     scanf("%f",&num[i]);
  
  for(i=0;i<4;i++)
     {
        sprintf(cx[i],"%d",(int)num[i]);
     }
  
  fun(num,cx,4);
  printf("no answer!");
  getch();
}


我来回复

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