“算24点”的算法设计
摘要:文章讨论了两种计算“24”的方法,并给出了各自的优点和缺点,也提出了一些改进方式。两种方法中方法二显然优秀些,也能给出所有的可能结果。
关键词:算“24”,子函数,顺序,程序流程
有一种扑克牌游戏,是用来锻炼算术运算能力的。就是一人手拿一定数量的牌,随意出四张牌,大家通过“+”,“-”,“*”,“/”以及括号来实现四个数字的最后运算结果为24。每张牌只能用一次,谁最先算出,谁就是赢家。
一 问题说明
1.一张牌对应一个数字,分别为“1----13”,大小王不计算在内。
2.每张牌运算的位置及先后顺序都不定。
3.只能使用加、减、乘、除和括号运算。
4.每个数字只能运算一次,每次得到的运算结果也只能参加一次运算,直至最后得到结果。
c++ 字符串常量
5.总共有牌数52张,“1----13”各有四张同样的牌。
二 解决方案(一)
由于每次出四张牌,牌数总数为52,共有排列数52*51*50*49=6497400种,对于每一种排列进行分类,哪些可以计算出来,哪些计算不出来,分别放在数据库中。当玩家输入四个数字时,直接调用数据库中对应的算式即可。
优点:方法简单易懂。
缺点:数据库建立麻烦。光是排列数就够烦人,每一种排列还要先计算它能否算出24,并且它无法知道计算的多种方式。
三 解决方案(二)
    由于只有加、减、乘、除和括号运算,对每次给出的数分别用这五种符号去填充。本人所采用的正是基于这种构想。所用的程序语言为C语言。
  3.1 建立模型
1.设给出的四个数为a,b,c,d.且它们的取值范围为1---13。
2.由于运算位置及顺序不定,还有括号运算的问题,我们先从四个数中任意取两个出来进行运算,再任意从剩下的两个数中取一个出来与第一步的运算结果运算,得到的结果与剩下的一个数进行运算。即计算顺序为“[(a&b)&c]&d ”(“&”表示运算符号).
3.两个数进行运算时不管他们的顺序。
4.运算包括“加,减,被减,乘,除,被除”,以此消除不考虑顺序引起的考虑不周。
5.第一步运算结果用一个6维数组保存,第二步运算结果用一个6*6维数组保存,第三步运行结果用一个6*6*6数组保存。
6.对所有结果查询,得到等于24的结果。给出最后答案。
3.2 重点介绍
    1. 三个子函数
        一个是数值互换函数,定义为SHIFTAB(A,B),实现把参数A,B的数值互换,方便提取a,b,c,d的12种组合。
          另一个函数是实现算术符号的输出。定义为GETSIGN(A);
          第三个函数是完成三步运算,得到三维6*6*6数组。定义为
CAL(A,B,C,D),运算框架为:
   
2.计算结果的保留
调用子函数时,函数的无法返回多个结果,因此不可能得到数组的结果。为保留数组值,不得不建立一个全局变量g[6][6][6]。尽管这会降低函数的可移植性。
3.计算结果的输出
结果输出时,很难输出算术符号。我引用了一个函数来处理。因为计算时所用符号的顺序是一定的,因此计算结果数组的中元素的下标值就表示了进行的是哪一步算术运算。通过数值型变量与字符型变量的转变实现符号的输出。
0--------------------加号-----------------------043(ASCII码)
1--------------------减号-----------------------045
2--------------------被减号--------------------045(与减号一致)
3---------------------乘号----------------------015
4----------------------除号---------------------047
5------------------------被除号----------------092
3.3 主程序流程图
 
   
   
                                  no
yes
                       
no
yes
                               
四 方案(二)的评价
优点:穷尽了多数计算的可能,给出了计算的所有结果。每次运算
6*6*6*12=2592(次)
    缺点:未曾考虑(a&b)&(c&d)的计算模式,无法穷尽所有结果。每次的运算次数还可以再压缩。
五 改进的方案(二)
5.1 增加一个子函数CALB(a,b,c,d),专门用来计算(a&b)&(c&d)模式。
5.2把被减号去掉,改用含有五个元素的一维,二维,三维数组,在判断时,将”g[i][j][k]=24?”改为”|g[i][j][k]|=24?”,即结果为“-24”的表达式也显示在屏幕上。这是我们每个人完全看的懂的。
5.3这使得运算次数为5*5*5*12*12=18000次。
5.4 总程序流程图与改变前相似,只是在中途增加了函数CALB(a,b,c,d)。
六 模型展开
6.1 输入的数据可以不局限于1---------13。
6.2 计算结果也可以为24之外的任意数。
6.3 而且运算符号也可以增加开方,指数运算等其他一元或者二员的运算。这只需将数组维数扩充就行了。
    若需程序或者源码,请与QQ:2080226280联系(可运行程序需要10元,源码10元,两者都要的需要支付20元)
参考文献:
1.《C程序设计》谭浩强编著。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。