二十四点游戏3
二十四点游戏3
09-10-14 &匿名提问
二十四点是一种益智游戏,它能在游戏中锻炼人们的心算,它往往要求人们将四个数字进行加减乘除四则混合运算(允许使用括号)求得二十四。 例如: 4*(5+1^6)=24 2*(3*3+3)=24 3^(10-7)-3=24 5^2-10+9=24 (10-4)*3+6=24 (6/3)*10+4=24 3*6+10-4=24 8/(3-8/3)=24 3×(4+-6+10)=24 3×(4+10+-6)=24 3×(-6+4+10)=24 3×(-6+10+4)=24 3×(10+4+-6)=24 3×(10-4)--6=24 3×(10+-6+4)=24 4--6÷3×10=24 4--6÷(3÷10)=24 (4+-6+10)×3=24 4--6×10÷3=24 4-10÷3×-6=24 4-10÷(3÷-6)=24 (4+10+-6)×3=24 4-10×-6÷3=24 (-6+4+10)×3=24 (-6+10+4)×3=24 10-(3×-6+4)=24 10-3×-6-4=24 10-(4+3×-6)=24 10-4-3×-6=24 (10-4)×3--6=24 (10+4+-6)×3=24 10-(4+-6×3)=24 10-4--6×3=24 10-(-6×3+4)=24 10--6×3-4=24 (10+-6+4)×3=24 高级二十四点则要求人们可以使用一些除了加减乘除之外的运算符号将四个只用加减乘除无法算出二十四的数字进行混合运算求得二十四。(注意:其他运算符号不得直接出现所给的四个数字之外的数字,例如可以直接出现平方根,但不能直接出现立方根,可以直接出现阶乘,但不能直接出现平方) 例如: (0!+0!+0!+0!)! (1+1+1+1)! (2+2)!+2-2 (7÷7%)的平方根+7+7 8的平方根×8的平方根+8+8 9的平方根×9的平方根×9的平方根-9的平方根 (lg10+lg10+lg10+lg10)![编辑本段]24点游戏算法 利用计算程序来完成这个计算二十四点的程序 方法如下: 首先穷举的可行性问题。我把表达式如下分成三类—— 1、 无括号的简单表达式。 2、 有一个括号的简单表达式。 3、 有两个括号的较复4、 杂表达式。 穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列,算法如下: /* ans[] 用来存放各种排列组合的数组 */ /* c[] 存放四张牌的数组 */ /* k[] c[]种四张牌的代号,其中k=I+1。 用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 */ /* kans[] 暂存生成的排列组合 */ /* j 嵌套循环的次数 */ int fans(c,k,ans,kans,j) int j,k[],c[];char ans[],kans[]; { int i,p,q,r,h,flag,s[4],t[4][4]; for(p=0,q=0;p&4;p++) { for(r=0,flag=0;r if(k[p]!=kans[r]) flag++; if(flag==j) t[j][q++]=k[p]; } for(s[j]=0;s[j]&4-j;s[j]++) { kans[j]=t[j][s[j]]; if(j==3) { for(h=0;h&4;h++) ans[2*h]=c[kans[h]-1]; /* 调整生成的排列组合在最终的表 达式中的位置 */ for(h=0;h&3;h++) symbol(ans,h); /* 在表达式中添加运算符号 */ } else { j++; fans(c,k,ans,kans,j); j--; } } } 正如上面函数中提到的,在完成四张牌的排列之后,在表达式中添加运算符号。由于只有四张牌,所以只要添加三个运算符号就可以了。由于每一个运算符号可重复,所以计算出其可能的种数为4*4*4=64种。仍然利用嵌套函数实现添加运算符号的穷举,算法如下: /* ans[],j同上。sy[]存放四个运算符号。h为表达式形式。*/ int sans(ans,sy,j,h) char ans[],sy[];int j,h; { int i,p,k[3],m,n; char ktans[20]; for(k[j]=0;k[j]&4;k[j]++) { ans[2*j+1]=sy[k[j]]; /* 刚才的四个数分别存放在0、2、4、6位 这里的三个运算符号分别存放在1、3、5位*/ if(j==2) { ans[5]=sy[k[j]]; /* 此处根据不同的表达式形式再进行相应的处理 */ } else { j++; sans(ans,sy,j--,h); } } } 好了,接下来我再考虑不同表达式的处理。刚才我已经将表达式分为三类,是因为添加三个括号对于四张牌来说肯定是重复的。对于第一种,无括号自然不用另行处理;而第二种情况由以下代码可以得出其可能性有六种,其中还有一种是多余的。
请登录后再发表评论!}