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编辑过]