首页 > 技术文章 > NIM(1) 一排石头的游戏

JuneWang 2014-06-05 23:40 原文

最近在实习面试过程中,一个朋友遇到了该问题,从简单到复杂的思路如下,希望能给遇到相同问题的朋友一些启发和帮助。(内容来源网络和《编程之美》)

 

1.问题1

100个苹果


桌上有100个苹果,你和另一个人一起拿,一人一次,每次拿的数量大于等于1小于等于5,问:如何拿能保证最后一个苹果由你来拿?

分析:如果要保证拿最后一个,那么就得保证拿到第94个,以此类推,要拿第94个,就要保证拿到第88个、82、76、70...最后只要保证你拿到第四个就行了,所以看下面:

解答:只需要你先拿,第一次拿4个,以后看对方拿的个数,根据对方拿的个数,保证每轮对方和你拿的加起来是6就行了,其实就是保证你拿到4,还要拿到10,16...直到94。

 

2.问题2

N块石头排成一行,每块石头有各自固定的位置。两个玩家依次取石头,每个玩家每次可以取其中任意一块石头,或者相邻的两块石头,石头在游戏过程中不能移位(即编号不会改变),最后能将剩下的石头一次取光的玩家获胜。这个游戏有必胜策略吗?

 

分析与解法:

(1)石头的数目N=1或者N=2

即只有一块或者两块石头,先取者即可一次取完所有石头儿获胜。

(2)石头的数目N=3

设三块石头排成一行,其编号为1、2、3,那么先取者若取中间的2号石头,后取者只能取左边1号或者右边3号石头,必将剩下一块石头,先取者将获取最后的那块石头而胜利。

(3)石头的数目N=4

设4块石头排成一行,其编号一次为1、2、3、4,那么先取者若取走2、3号石头,后取者只能取最左边1号或者罪右边4号,必将剩余一块石头,先取者将取得最后的那块石头而获胜。

(4)石头的数目N>4

如果N>4,先取者取中间的一个(N为基数)或者中间相连的两个(N为偶数),确保左右两边的石头数目是一样的,之后先取者只要每次以处事中心为对称轴,在于后取者所取石头位置对称的地方取得数目相同的石头,就可以保证每次都有石头取,并且必将取得最后的石头,赢的游戏。

所以先取者将有必胜的策略。

 

祝大家玩得愉快。

推荐阅读