欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

计算24点

最编程 2024-08-01 11:48:47
...

//---------------------------------------------------------------------------
//24点的C++算法

//---------------------------------------------------------------------------

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

//计算24点
void __stdcall Compute24(int len);


//EXP[0]-EXP[1]无用,EXP[2]-EXP[4]记录操作符
int EXP[5];

//OPT[0]-OPT[1]无用,OPT[][0]-EXP[][3]分别对应操作数a,操作数b,结果t
float OPT[5][3];

//四个数字
//float NUM[4]={5,5,5,1};//有解
float NUM[4]={2,3,5,6};//有解
//float NUM[4]={3,4,6,7};//无解

//最终结果
const float result=24.0;

//解的个数
int count=0;

//测试
void test(void)
{ //产生随机数,1-9,不重复
 srand(GetTickCount());
 for(int i=0;i<4;++i)
 { int j,t;
  do
  { t=1+rand()%9;
   for(j=0;j<i;++j)
    if(t==NUM[j])
     break;
  }while(j<i);
  NUM[i]=(float)t;
 }

 printf("/t%3.3f,%3.3f,%3.3f,%3.3f/n",NUM[0],NUM[1],NUM[2],NUM[3]);
 Compute24(4);
 if(count==0)
 { printf("/t对不起,本次无解!/n");
 }
// system("pause");


//计算24点
void __stdcall Compute24(int len)
{ //终止条件
 if(len==1)
 { if(fabs(NUM[0]-result)<0.001)
  { printf("第%d种:/n",++count);
   for(int i=4;i>1;--i)
   { printf("/t%3.3f/t%3c/t%3.3f/t=/t%3.3f/n",/
      OPT[i][0],EXP[i],OPT[i][1],OPT[i][2]);
   }
  }
  return;
 }
 //任取两数
 for(int i=0;i<len;++i)
 { for(int j=i+1;j<len;++j)
  { float a=NUM[i];
   float b=NUM[j];
   float t;
   NUM[j]=NUM[len-1];//调整数组

   //六种可能,分别执行
   OPT[len][0]=a,OPT[len][1]=b;
   
   NUM[i]=t=a+b;//加法
   EXP[len]='+',OPT[len][2]=t;
   Compute24(len-1);
   
   NUM[i]=t=a-b;//减法
   EXP[len]='-',OPT[len][2]=t;
   Compute24(len-1);

   NUM[i]=t=a*b;//乘法
   EXP[len]='*',OPT[len][2]=t;
   Compute24(len-1);
   
   if(fabs(b)>0.001)
   { NUM[i]=t=a/b;//除法
    EXP[len]='/';
    OPT[len][2]=t;
    Compute24(len-1);
   }

   OPT[len][0]=b,OPT[len][1]=a;
   NUM[i]=t=b-a;//交换减法
   EXP[len]='-',OPT[len][2]=t;
   Compute24(len-1);

   if(fabs(a)>0.001)
   { NUM[i]=t=b/a;//交换除法
    EXP[len]='/';
    OPT[len][2]=t;
    Compute24(len-1);
   }

   //恢复数组
   NUM[i]=a;
   NUM[j]=b;
  }
 }
}
*/