编程之美 - NIM“拈”游戏分析

NIM“拈”游戏分析

问题

有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜。每次取石头时,每个玩家只能从若干堆石头中任选一堆,取这一堆石头中任意数目(大于1)个石头。

请问:玩家A有必胜策略吗?要怎么分配和取石头才能保证自己有把握取胜?

 

 

解法与分析

据说,该游戏起源于中国,英文名字叫做“NIM”,是由广东话“拈”(取物之意)音译而来,经由当年到美洲打工的华人流传出去,这个游戏一个常见的变种是将十二枚硬币分三列排成 [3,4,5] 再开始玩 。我们这里讨论的是一般意义上的“拈”游戏。

言归正传,在面试者咄咄逼人的目光下,你要如何着手解决这个问题?

在面试中,面试者考察的重点不是“what”——能否记住某道题目的解法,某件历史事件发生的确切年代,C++语言中关于类的继承的某个规则的分支等。面试者很想知道的是“how”——应聘者是如何思考和学习的。

所以,应聘者得展现自己的思路。解答这类问题应从最基本的特例开始分析。我们用N表示石头的堆数,M表示总的石头数目。

当N=1时,即只有一堆石头——显然无论你放多少石头,你的对手都能一次全拿光,你不能这样摆。

当N=2时,即有两堆石头,最简单的情况是每堆石头中各有一个石子(1,1)——先让对手拿,无论怎样你都可以获胜。我们把这种在双方理性走法下,你一定能够赢的局面叫作安全局面。

当N = 2,M > 2时,既然(1, 1)是安全局面,那么(1, X)都不是安全局面,因为对手只要经过一次转换,就能把(1, X)变成(1, 1),然后该你走,你就输了。既然(1, X)不安全,那么(2, 2)如何?经过分析,(2,2)是安全的,因为它不能一步变成(1,1)这样的安全局面。这样我们似乎可以推理(3, 3)、(4, 4),一直到(X, X)都是安全局面。

于是我们初步总结,如果石头的数目是偶数,就把它们分为两堆,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值