讨论24点算法。
24点是扑克牌游戏 玩法是:从一副扑克的A到10里随意抽出4张牌
用‘加’’减‘‘乘’‘除’四个符号算出4个数是否等于24,是
的话成功,否的话失败;
我用的是穷举法!(源码有点长)
就是穷举出所有可能的算术式;
我们想设4张牌为W,X,Y,Z;
先把4张牌做排列组合:
如W;X;Y;Z; W;X;Z;Y; W;Y;X;Z;
W;Y;Z;X; W;z;x;y; w;z;y;x;
x;w;y;z; x;w;z;y; x;y;w;z;
x;y;z;w; x;z;w;y; x;z;y;w;
等等 。。。24种排列:
然后在带如算术符号
如:+ + +;+ -+;+ * *;+ * /;+ + -;
等等穷举的所有算术符号;(目前我找到的共有43种
可能不全);
下面是我编的源码;
#include"stdio.h"
int kind(int a[4],int w,int x,int y,int z,int n)
{
switch(n)
{
case 1: a[0]=w;a[1]=x;a[2]=y;a[3]=z;
case 2: a[0]=w;a[1]=x;a[2]=z;a[3]=y;
case 3: a[0]=w;a[1]=y;a[2]=x;a[3]=z;
case 4: a[0]=w;a[1]=y;a[2]=z;a[3]=x;
case 5: a[0]=w;a[1]=z;a[2]=x;a[3]=y;
case 6: a[0]=w;a[1]=z;a[2]=y;a[3]=x;
case 7: a[0]=x;a[1]=w;a[2]=y;a[3]=z;
case 8: a[0]=x;a[1]=w;a[2]=z;a[3]=y;
case 9: a[0]=x;a[1]=y;a[2]=w;a[3]=z;
case 10:a[0]=x;a[1]=y;a[2]=z;a[3]=w;
case 11:a[0]=x;a[1]=z;a[2]=w;a[3]=y;
case 12:a[0]=x;a[1]=z;a[2]=y;a[3]=z;
,。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。。
case 24: a[0]=z;a[1]=y;a[2]=w;a[3]=x;
}
因为没办法一下返回4个数字,所以就用数组来返回
被改变的4个数字;(如有更好的办法请告之)
main()
{
int i,j,w,x,y,z,s,find=0; /w,x,y,z是4张牌s是牌的和
find 是找到标志*/
int a[4];
clrscr();
do{
printf("请输入4张牌的面值[1-10]“);
scanf("%d %d %d %d",&w,&x,&y,&z);
}while(w>=11||x>=11||y>=11||z>=11);
for(j=1;j<=43;j++)/*穷举符号的排列次数*/
{
switch(j)
{
case 1:
for(i=1;i<=24;i++)
{
kind(a,w,x,y,z,i)
s=a[0]+a[1]+a[2]+a[3];
if(s==24)
{
printf("%d+%d+%d+%d=24",a[0],a[1],a[2],a[3]);
find=1;break;
}
}break;
case 2:
for(i=1;i<=24;i++)
{
kind(a,w,x,y,z,i);
s=a[0]+a[1]+a[2]-a[3];
if(s==24)
{
printf("%d+%d+%d-%d=24",a[0],a[1],a[2],a[3]);
find=1;break;
}
}break;
case 3:
for(i=1;i<=24;i++)
{
kind(a,w,x,y,z,i);
s=a[0]+a[1]-a[2]+a[3];
if(s==24)
{
printf("%d+%d-%d+%d=24",a[0],a[1],a[2],a[3]);
find=1;break;
}
}break;
case 4:
for(i=1;i<=24;i++)
{
kind(a,w,x,y,z,i);
s=(a[0]+a[1]+a[2])*a[3];/*别忘了带括号*/
if(s==24)
{
printf("(%d+%d+%d)*%d=24",a[0],a[1],a[2],a[3]);
find=1;break;
}
}break;
case 5:
.................
.................
................
..............
...............
case 43:
for(i=1;i<=24;i++)
{
kind(a,w,x,y,z,i);
s=a[0]/a[1]a*[2]*a[3];
if(s==24)
{
printf("%d/%d*%d*%d=24",a[0],a[1],a[2],a[3]);
find=1;break;
}
}break;
}
}break;
if(find==0)
printf("组不成24“);
getch();
}
这到题我是在做同济大学题库里的排列组合是想到的
有什么更简单的方法就一起讨论讨论。。。。
[此贴子已经被作者于2004-10-19 00:13:12编辑过]