C语言火柴游戏的程序设计+流程图(5)_毕业论文

毕业论文移动版

毕业论文 > 计算机论文 >

C语言火柴游戏的程序设计+流程图(5)


归纳一下的话,设每次最多可以取得的火柴数目为n,设当前剩余的火柴总数为m,则,当(n+1) >= m >= 2时,当前的游戏者必定可以取得游戏的胜利。
由此,我们可以得到一个结论:无论火柴的总数目是多少,无论单次可取得的最大火柴数目是多少,尽管在火柴游戏的进行过程中,火柴的总数目可能有着无数种不规律不规则的改变,只要等到游戏快结束的时候,只要到最后,火柴剩下的总数目为m,m小于等于单次最多可以取得的火柴数目(n+1),且m自身不为1,则当前轮到取走火柴的游戏者就可以取得游戏的胜利。
2.2    基于火柴总数目为25,每次最多取得数目为5的进一步分析
由上面2.1的分析可知,无论火柴的总数目是多少,无论单次可取得的最大火柴数目是多少,尽管在火柴游戏的进行过程中,火柴的总数目可能有着无数种不规律不规则的改变,只要等到游戏快结束的时候,只要到最后,火柴剩下的总数目为m,m小于等于单次最多可以取得的火柴数目(n+1),且m自身不为1,则当前轮到取走火柴的游戏者就可以取得游戏的胜利。
而且,经过2.1的分析,我们也清楚的意识到了,如果想要通过去分析火柴游戏过程中火柴总数的变化,来找到解决问题的方案的话,基本上是不可能的。因为火柴总数少的时候我们还可以一步步的分析讨论下来。当火柴总数成百上千,甚至上万时,这样的分析不但需要大量的时间,而且有着指数倍增长的可能性,难以统计,而且还不一定有解决这一火柴游戏的方法。
上面2.1的结论是在火柴游戏进行到结尾的时候被我们发现的,既然当火柴游戏进行到结尾时必定有那些可能使其中一名游戏者取得胜利,那么我们不妨倒推过去,从游戏的结尾倒推游戏的过程到游戏开始时的情况,说不定可以发现一线有用的线索,来帮助我们进一步地了解这个火柴游戏。
这里,我们假设火柴的总数目还是为25,每次最多可以取走的火柴数目还是5。由2.1的结论可知当轮到我们取走火柴的时候,若火柴当前的总数目为6—2时,那么,我们就可以保证取得游戏的胜利。现在开始往回逆推,火柴总数既然剩下了6—2,这是由另一位游戏者取走火柴后所剩下的火柴总数,由于单次最多可以取得的火柴数目为5,那么之前剩余的火柴总数可能是6+5=11、2+5=7,也可以是6+1=7—2+1=3。11—7与7—3,合并起来就是11—3都可能是原先的火柴总数。这里需要注意一个问题,因为当火柴的总数目小于等于6大于等于2时,当前的玩家就可以取得游戏的胜利,所以范围不应该是11—3,而是应该为11—7。
上一次的火柴总数为11—7,然后下一次的火柴总数为6—2,然后我们就可以取得游戏的胜利了。这个逆推过程看起来很对,但其中还是存在着一些问题。所谓逆推,逆推后的结果正着推会下来应该是要满足所有条件才对,11—7,若我们按照取每次所能取得火柴的最大数目的话,得到的结果是6—2,没有问题,但是,如果我们不按照最大数字取呢?因为游戏进行过程中,发生什么情况都是有可能的。如果我们按照每次取火柴的最小数目取呢,即取走1根火柴,那么11—7,得到的结果就是10—6,很明显是不符合条件的。但是我们发现,10—6中,6是满足以上所有条件的,所以说,在11—7中,无论先前游戏者取走多少根火柴,只要原先火柴数目为7,那么我们在下一次的火柴游戏中,遇到的剩下的火柴总数必定在6—2这个范围里,可由2.1中得到的结论所知,那个时刻,我们其实已经赢得了比赛。由此,我们也可以得到另一个结论:当我们之前的游戏者遇到火柴总数为7的情况时,其实我们已经赢得了游戏。为什么我们已经赢得了游戏呢?因为我们之前的游戏者遇到火柴总数为7,经过他拿取后火柴总数在2到6这个范围里面,再经过我们拿取,火柴的总数必定为1,再由对方拿取时,只剩一根火柴,对面取得最后一根火柴,游戏结束,我们取得游戏的胜利。 (责任编辑:qin)