nim(2)"拈"游戏分析

来自《编程之美》上的博弈问题。

题目是这样的。有M块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA.....的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜。每次取石头时,每个玩家只能从若干堆石头任选一堆,取这一堆石头中任意数目(大于0)个石头。请问:玩家A要怎样分配和取石头才能保证自己有把握取胜?

分析与思考:我们可以将这个问题从最简单的情况逐渐复杂化分析,然后从中找出规律,然后再对所得规律加以证明。这样一个过程是分析问题解决问题的一种方式方法。

设N块石头堆,M块石头

接下来我们从N=1时开始分析,此时只有一堆石头,直接一次拿完,所以先手获胜。

N=2,M=2时,每堆石头各有一个石头。还是先手获胜。M>2时,对于(1,X)(X>1)情况,先手只要在X堆中拿走X-1个石头,这时情况转变为(1,1),最后还是先手获胜。对于(2,2),(3,3),(4,4)...(M/2,M/2)情况,都是后手获胜。因为不管先手从某一堆中拿走几个石头,都会引起两堆石头数量不平衡,而后后手都能把两堆石头数量变为相等(即为平衡),两堆石头相等后,如果(0,0),那么后手获胜。如果(x,x)(x>1),那么继续进行按照上述方法进行,可以看出两堆数量相等时,总是后手操作结果,不等时总是先手操作结果,并且先手没办法把两堆相等石头保持相等,因为一次只能改变一堆石头的数量。最后总是能得到(0,0)结果,所以后手总能·获胜。由此可以看出M为偶数时,只需将石头分成数量相等的两堆,后手必有方法获胜。

下面分析M为奇数时的情况,对于M=3,5,7时得出的结论是总是先手获胜。

那么这个结论到底正确与否?我们将证明这个结论。

《编程之美》只给出了结论。结论是假设我们把石头分解为N堆。那么对于奇数个石头总有XOR(M1,M2,...Mn)!=0。.........结论一

原因:如果M为奇数,那么转化成二进制,最后的二进制位一定为1,所以M1+M2+Mn=M,这些由0或1组成的Mi的最后一位的和总是1,那么根据二进制加法:1+1=原位变为0并且向前进一位,0+0=0原位还是0,1+0=1 原位变为1,所以可以推测M1,M2,...Mn这M个数最后一位1的个数总是奇数。只有奇数个1之和,取和之后最后一位才能变为1,从而满足最初M为奇数的设定。既然我们已经知道这被分解的M个数中的最后一位有奇数个1,那么我们做异或(异或和二进制求和类似,只是求和时需要进位而已)时,这M个数异或后,最后一位必为1,所以就有上述结论。

可以证明;当XOR(M1,M2,...Mn)!=0时,我们只需要改变某一个Mi的值。就可以让XOR(M1,M2...Mj...Mn)=0..............................结论二

原因:XOR!=0说明M1,M2,...Mn中必有某些位上在这M个数中该位的1的个数为奇数(比如101,011,111,每个数的第三位上1的总个数为3,而第1个数(101)的第2位为0,第2,3个数第2位均为1,那么这3个数第二位1的总个数就为2,以下分析都是根据这种分析得出的结论。),我们仅需将对应的某些奇数个1的位上的1的个数转变为偶数个1即可(某些位由0->1或1->0都可以实现某些位变为偶数个1,由于每个数都可以经过这样的变动,所以第二步关键是看数的选择。要求是选择一个经过这种改变后,改变后的数变小即可,),这样这M个数的每个位上都总共有偶数个1后,XOR=0。从而证明了结论二的正确性。

可以证明:当XOR(M1,M2,...Mn)=0时,我们总是只需要改变任何一个Mi的值,就可以让XOR(M1,M2...Mj...Mn)=0...............结论三

原因:XOR=0时,每一位上1的(对于这M个数来说)总个数都为偶数,所以改变其中任意一个数,都会引起某些位上的1的个数的增减,不管1的个数是增加1还是减少1,都会使某些位上1的个数变为奇数个,那么必有XOR≠0.从而证明了结论三的正确性。

最后总结:M为奇数时,无论怎样分堆,先手总是把这些堆石头的XOR设置为0,而后手总是素手无策的做出任何改变都不会把XOR设置为0,而最终只有XOR=0时才能获胜,所以总是先手赢。通过分析M个石头中每堆石头的数量的二进制位上,每位上1的总个数来得出上面三个结论不失为一种解决这个问题的方法。

以上红字和粗体字是我对《编程之美》石头游戏2中给出结论的证明与理解。



时间: 2024-12-15 04:51:05

nim(2)"拈"游戏分析的相关文章

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

NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若干堆石头中任选一堆,取这一堆石头中任意数目(大于1)个石头. 请问:玩家A有必胜策略吗?要怎么分配和取石头才能保证自己有把握取胜? 2. 解法与分析 据说,该游戏起源于中国,英文名字叫做“NIM”,是由广东话“拈”(取物之意)音译而来,经由当年到美洲打工的华人流传出去,这个游戏一个常见的变种是将十二

[游戏分析]刺客信条:兄弟会(Assassin's Creed: Brotherhood)

1 机制 1.1 界面与按键 1.1.1 在主菜单进行功能选择时,画面右下角会伴有按键提示字幕,如{Enter}选择(按Enter键即选择当前指定的功能).{Backspace}返回等. 1.1.2 在游戏进行过程中,画面右上方始终会显示一套按键组合,该组合包含4个{按键}+提示文字的配对.组合内的各个{按键}+提示文字配对会因主角所处场景(行走.攀爬.战斗等)的不同作出对应的变化,以保证玩家在不同场景下都可以迅速了解自己可选择的最基本的操作方法. 1.2 教程 1.2.1 简要介绍前两部的剧情

大数据云时代 游戏分析存在4大误区

最近几年,大数据这个词的火爆以及大数据技术的迅速发展,数据分析和数据挖掘的工作得到越来越多企业的重视,特别是在游戏行业,越来越多关于数 据的分析容和观点也井喷式提出,“数据驱动下的精细化运营”,“玩家群体的定量研究”,“移动游戏数据分析体系”等等概念的提出,可以看出游戏的研发和运 营过程中,对数据分析的需求是无穷无尽的,相应的,对数据分析的讨论也是各抒己见.而盲目过度依赖数据,或者主观的解读数据,带来的损失则是无法估计的. 以下,我将结合自己的工作经历,阐述以下数据指标会骗人和游戏数据分析中的几

(转)CocosCreator零基础制作游戏《极限跳跃》一、游戏分析

CocosCreator零基础制作游戏<极限跳跃>一.游戏分析 无意中发现了小游戏<极限跳跃>感觉挺有意思的,正好这段时间和朋友讨论准备用js还是unity做小游戏,初定用js,使用CocosCreator,于是我拿这款游戏练手,准备一天时间做出来,结果一天只完成了四分之三,后面又用了几个晚上,加碰撞检测,加声音音效..把这游戏的制作记录下. 1.吐槽加游戏分析 http://www.byjth.com/CocosCreator/66.html 2.制作游戏开始场景 http://

Java太阳系小游戏分析和源码

-20150809 最近看了面向对象的一些知识,然后跟着老师的讲解做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下最近学的知识: 用到知识点:类的继承.方法的重载与重写.多态.封装等 分析: 1.需要加载图片.画图 2.建一个面板,主页面 3.行星类 ... 效果图: 先看一下源码结构图: 现在逐步分析各个类的功能: 1)工具类-----util包中 --Constant类   封装了游戏中用到的常量 --GameUtil类  封装了游戏的图片加载功能 --MyFrame类  封装了游戏面板

Java太阳系小游戏分析和源代码

-20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载与重写.多态.封装等 分析: 1.须要载入图片.绘图 2.建一个面板.主页面 3.行星类 . . . 效果图: 先看一下源代码结构图: 如今逐步分析各个类的功能: 1)工具类-----util包中 --Constant类   封装了游戏中用到的常量 --GameUtil类  封装了游戏的图片载入功能 --MyFrame类  封装了游

列王的纷争——游戏分析

游戏框架 快速地发展以求能和其余玩家更好的互动. 发展城市是这个游戏的主要部分.因为所有的战斗都只是根据双方队伍的数据直接进行系统判定,并无人为操作,所以只有自己的城市比别人更强大,才能在与其余玩家的对战中获得比较好的体验与满足感. 城市发展分为两个部分,资源采集与城市建设.而资源采集这一块较为简单,玩家也很难出现资源不够用的情况.真正对玩家进行划分的是城市建设这一块.城堡.兵营.行军帐篷等的等级越高,那么出战士兵越厉害,数量越多,也就自然必胜于等级较低的玩家.而城市建设需要花费大量的时间,这也

编程之美----NIM游戏

: 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏.在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个石子.每一次行动,Alice和Bob可以选择从一堆石子中取出任意数量的石子.至少取1颗,至多取出这一堆剩下的所有石子.Alice和Bob轮流行动,取走最后一个石子的人获得胜利.假设每一轮游

(转载)Nim游戏博弈(收集完全版)

Nim游戏的概述: 还记得这个游戏吗?给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输.后来,在一份资料上看到,这种游戏称为“拈(Nim)”.据说,它源自中国,经由被贩卖到美洲的奴工们外传.辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞.后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩.最有名的玩法,是把十二枚便士放成3.4.5三列,拿光铜板的人赢.后来,大家发现,先取的人只要在3那列里取走2枚,变成了1.4.5,就能稳操胜券了