NIM(1)一排石子的游戏

转载:编程之美-MIN(1)一排石头的游戏

1. 原题

1.1 题目

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

1.2 解答

已知:石头数量为N,假设两个玩家分别为玩家A和玩家B,且玩家A先取石头。

当N<=2时,玩家A可以直接取完所有的石头,玩家A有必胜策略。

当N=3时,玩家A先取中间的1个石头,剩下的两个石头,玩家B只能取其中的1个,最后1个由玩家A取得,玩家A有必胜策略。

当N=4时,玩家A先取中间的2个石头,这会又剩下2个石头,玩家B还是只能取其中1个,最后一个由玩家A取得,玩家A有必胜策略。

当N>4,且N为奇数时,玩家A取中间的1个石头,剩下的左边石头情况和右边石头情况一样,那么无论玩家B如何取石头,玩家A只要

在相反的方向取相同数量的石头即可,如此下去,最后必然玩家A取得最后的石头,A有必胜策略。

根据上面的归纳,先手的玩家只有把中间的石头拿走,如果N是奇数,就拿走中间的1个石头,如果N是偶数,就拿走中间的2个石头,

这样留给玩家B一个对称的局面,接着,无论玩家B怎么拿石头,玩家A都保证对称局面不变,这样,最后肯定是A取得最后的石头。

2. 扩展1

2.1 题目

若规定最后取光石头的人输,又该如何应对?

2.2 解答

N=1时,A必须取得这唯一的也是最后的一个石头,A必然输掉,这是必然结果,无需策略。

N=2时,A取一个石头,那么B必然取得剩下的一个石头,A有必胜策略。

N=3时,A取两个石头,那么B必然取得剩下的一个石头,A有必胜策略。

N=4时,若A取两个石头,那么B取一个石头,A只能取最后剩下的一个石头。

若A取一个石头,那么B取两个石头,A只能取最后剩下的一个石头。

因此,无论A怎么取,B都有必胜策略。

N=5时,A只需取边上的一个石头,这样就转化为N=4,B先取了,这样根据上面的分析,可知N=4时,后取的有必胜策略,

因此,A有必胜策略。

N=6时,A只需取边上的两个石头,这样就转化为N=4,B先取了,这样根据上面的分析,可知N=4时,后取的有必胜策略,

因此,A有必胜策略。

从上面可以看出,从3开始A的胜负交替出现,以后的每个问题都可以转化为上一个的子问题,因此N>=3时当N为奇数时A有必胜策略,当N为偶数时B有必胜策略。

感觉这个扩展中比较麻烦的地方在于“一排石子”,而且N很大的情况下,如果一步一步A和B分别取石子后,最后得到的石子之间可能不是连续的,这样结果就不确定了。比如:最后还有3个连续的石子,A先取,A有必胜策略;最后还有3个都不连续的石子,A先取,A肯定失败。所以呢,最后剩余的石头状态很重要,现在我只是分析到这里,也没看到网上谁很好的解决了这个问题。

3. 扩展2

3.1 题目

若两个人轮流取一堆石头,每人每次最少取1块石头,最多取K块石头,最后取光石头的人赢得此游戏。

3.2 解答

1)极端情况:K>=N

玩家A可以直接取掉所有石头,获得胜利。

2) 一般情况:K<N

这里面有个规律,就是,无论一个玩家拿了多少个石头,另一个玩家都能够选择相应的石头数量,使得两个玩家一起拿K+1个石头。

从上面这个思路,我们考虑N与K+1之间的数值关系:

N = (K+1) * c + d,其中c>=1,d>=0

当d!=0时,玩家A先取d个石头,这样还剩(K+1)*c个石头。然后轮到玩家B取石头,不管玩家B取了多少个石头,玩家A都再取相应

的石头,使得玩家A和玩家B一起取(K+1)个石头,这样,还剩(K+1)*(c-1)个石头,如此往复,最后,肯定A取完石头。

举例说明:

剩余石头数目         取石头

(K+1) * c + d          A取d个

(K+1) * c          B取X个,A取(K+1-X)个

(K+1) * (c-1)     ...

K+1                      B取X个A取(K+1-X)个

0

当d=0时,无论A取多少个石头,B取相应的石头,使得A和B一起取(K+1)个石头,这样最后取到石头的肯定是玩家B。

举例说明:

剩余石头数目        取石头

(K+1) * c               A取X个,B取(K+1-X)个

(K+1) * (c-1)         ...

...                         ...

K+1                      A取X个,B取(K+1-X)个

0

即N%(K+1)==0时,玩家B有必胜策略,N%(K+1)!=0时,玩家A有必胜策略。

可以看出来,如果K很大的话,而N的数值是随机的话,先手的优势是很明显的。

第1章 游戏之乐——NIM(1)一排石子的游戏的更多相关文章

  1. 第1章 游戏之乐——NIM(2)“拈”游戏分析

    NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...

  2. 第1章 游戏之乐——NIM(3)两堆石头的游戏

    NIM(3)两堆石头的游戏 1. 问题描述 假设有两堆石头,有两个玩家会根据如下的规则轮流取石头:每人每次可以从两堆石头中各取出数量相等的石头,或者仅从一堆石头中取出任意数量的石头:最后把剩下的石头一 ...

  3. NIM(1) 一排石头的游戏

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

  4. [ACM_数学] Fibonacci Nim(另类取石子,2-4组合游戏)

    游戏规则: 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完: 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍). ...

  5. (linux shell)第二章--命令之乐(一)

    文章来自于我的个人博客:(linux shell)第二章--命令之乐(一)    上一章我们描写叙述了一些linux shell中须要注意的一些语法.接下来我们開始了解linux shell的经常使用 ...

  6. Poj 1067 取石子游戏(NIM,威佐夫博奕)

    一.Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子. ...

  7. NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结

    NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结 经典NIM游戏: 一共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子 ...

  8. 【读书笔记《Android游戏编程之从零开始》】16.游戏开发基础(动画)

    1. Animation动画   在Android 中,系统提供了动画类 Animation ,其中又分为四种动画效果: ● AlphaAnimation:透明度渐变动画 ● ScaleAnimati ...

  9. 【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)

    剪切区域也称为可视区域,是由画布进行设置的:它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域外,绘制的任何内容都将看不到:可视区域可以是圆形.矩形等等. 画布提供了三种设置可视区域 ...

随机推荐

  1. 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表

    (先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...

  2. IOC框架Ninject实践总结

    原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...

  3. NiuTrans 日记 1

    这些天把东北大学自然语言实验室的NiuTrans 系统搭建并按照例子将短语系统运行了一遍,写这个日记主要是为了以后能提醒自己在这其中遇到的问题. 环境:短语系统我是windows和linux都运行了, ...

  4. 接入脚本interface.php实现代码

    承接上文的WeChatCallBack 在WeChatCallBack类的成员变量中定义了各种消息都会有的字段,这些字段在init函数中赋值.同时也把解析到的XML对象作为这个类的成员变量$_post ...

  5. Oracle中错误代码ORA-02292 违反了完整性约束条件解决

    百度处理: A表被B表引用,删除A表的时候提示ORA-02292,A表的主键被引用了,虽然已经把B表的数据全部删除掉,但仍然删除不了A表的数据.解决办法: 用禁用约束语句把A表的主键约束给禁用掉.1. ...

  6. SQL对字符串进行排序

    假设字符串中只由'A'.'B'.'C'.'D'组成,且长度为7.并设函数REPLICATE(<字符串>,<n>)可以创建一个<字符串>的n个副本的字符串,另外还有R ...

  7. 读pomelo的教程-2

    下面从头到尾记录chat demo的Login的过程 client:点击login按钮,取得username和rid两个值 $("#login").click(function() ...

  8. 【SummaryPlan】Summary of Feb & Plan of March——How to 'just do it'?

    Why I choose to be a graduate student from an undergraduate student? It’s time to applying for inter ...

  9. Tkinter教程之Text(2)篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811347 '''Tkinter教程之Text(2)篇''''''6.使用tag来指定文本的属 ...

  10. Bmob第三方登录详解

    Bmob第三方登录详解 Bmob 第三方登录 简介 本文主要介绍新浪微博,QQ,微信的登录接入以及如何配合BmobSDK中的第三方登录功能实现第三方登录. 在使用之前请先按照快速入门创建好可以调用Bm ...