主题:[讨论]求24点算法
虎虎虎1986
[专家分:180] 发布于 2007-04-05 20:38:00
高手门。谁会24点算法?除了穷举就没有别的算法了吗?
回复列表 (共9个回复)
沙发
Rick0ne [专家分:1490] 发布于 2007-04-06 14:06:00
C语言区的雨中飞燕有程序,请教一下她吧
板凳
虎虎虎1986 [专家分:180] 发布于 2007-04-07 16:50:00
我不知道怎么找她啊。
3 楼
hitsoft [专家分:280] 发布于 2007-04-07 17:16:00
我想到的也是穷举.反正所有的情况又不多,给你个程序,我大一的时候学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 楼
hitsoft [专家分:280] 发布于 2007-04-07 17:16:00
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 楼
hitsoft [专家分:280] 发布于 2007-04-07 17:17:00
写得很是累赘,不好意思。当时刚学C语言,糊里糊涂的.
6 楼
vfdff [专家分:740] 发布于 2007-04-07 19:46:00
没有注释的 好难理解
7 楼
vfdff [专家分:740] 发布于 2007-04-07 19:52:00
#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 楼
虎虎虎1986 [专家分:180] 发布于 2007-04-08 20:23:00
辛苦你了。没有功劳也有苦劳。谢谢了。
9 楼
虎虎虎1986 [专家分:180] 发布于 2007-04-08 20:30:00
我先看一看再给你评分。谢谢了。辛苦啊。
我来回复