当前位置: 代码迷 >> C语言 >> 讨论24点算法。
  详细解决方案

讨论24点算法。

热度:263   发布时间:2004-10-17 22:01:00.0
讨论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编辑过]

搜索更多相关的解决方案: 算法  

----------------解决方案--------------------------------------------------------

怎么没人顶啊

是不是写的不好????


----------------解决方案--------------------------------------------------------

好长的代码啊,晕死啊~


----------------解决方案--------------------------------------------------------

长是长了点

你有短点的好点的么?

怎么不写出来?


----------------解决方案--------------------------------------------------------
有时间我自己设计一下
----------------解决方案--------------------------------------------------------
请问能不能带小括号啊?

----------------解决方案--------------------------------------------------------
  相关解决方案