取子游戏_博弈简单分析

合集下载

博弈论取石子问题

博弈论取石子问题

博弈论取石子问题
博弈论取石子问题是一类经典的博弈问题,也被称为Nim游戏。

这个问题一般描述为:有一堆石子,两名玩家轮流从中取出若干个石子,每次取石子的数量有限制(例如,每次最多只能取1个或者2个),最终取光所有石子的玩家获胜。

在这个问题中,两位玩家都采取最优策略,并且可以假设每位玩家都会尽力阻止对方获胜。

这样,对于每一轮的取石子操作,可以通过数学的方法来判断哪位玩家有必胜策略。

一般来说,博弈论取石子问题可以通过异或运算来求解。

具体思路如下:
1. 通过异或运算计算出所有石子数量的异或和。

2. 如果异或和为0,表示当前状态下无论怎么取石子,都无法保证必胜,此时当前玩家必输。

3. 如果异或和不为0,表示当前状态下存在某种取法,可以保证必胜。

具体的取法是找到最高位上的1,然后将某一堆石子数量减去该最高位1的数量,使得新的异或和为0。

通过上述思路,可以快速计算出哪位玩家具有必胜策略。

当然,如果可以通过编程的方式来模拟和计算,会更加直观和方便。

博弈之取石子经典游戏

博弈之取石子经典游戏

由poj 1067引发的——取石子游戏【转自各类博弈】(2011-07-25 23:46:54)[编辑][删除]分类:编程道路~标签:杂谈上次做poj 1067的取石子游戏,只用到了whthoff博弈,未涉及到取石子的异或方法,今天重新搜索,整理了一遍。

搜罗各种资料,加上自己整理,终于成篇啦!……噼里啪啦取石子问题有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。

两个人轮流从堆中取物体若干,规定最后取光物体者取胜。

这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。

下面我们来分析一下要如何才能够取胜。

(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。

最后取光者得胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。

因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。

总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

即,若n=k*(m+1),则后取着胜,反之,存在先取者获胜的取法。

n%(m+1)==0. 先取者必败。

这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。

从一堆100个石子中取石子,最后取完的胜。

(二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

这种情况下是颇为复杂的。

我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。

组合游戏

组合游戏
在普通博弈游戏中,有如下性质:
所有的结束位置都是P位置; 从任意一个N位置出发,通过一步一定能到达某个P位 置。 从任意一个P位置出发,只移动一步所到达的只能是N 位置。
减法游戏-定义
用s表示一个正整数构成的集合,基于S所定义的 减法游戏可以描述如下: 有一个由n个石子组成 的石子堆,两名玩家轮流从中拿走石子,每次拿 走石子的个数只能是集合S中的数。拿走最后一 枚石子的玩家获胜。
Misère-Nim-解
当有两个或两个以上的堆中包含的石子数目大于1时:由于两个 人都不可能一下把多个石子数大于1的堆变为没有大于1 的堆, 所以肯定会有一个人拿玩石子后,只剩下一个大小大于1的堆, 这时下一个要拿石子的人将获胜。可以发现,只有一堆石子数目 大于1的时候,Nim-Sum肯定不为0,所以如果初始状态下的NimSum为0,那么先手必败,否则先手必胜。证明的思路是:如果 Nim-Sum为0,那么下一个人不论怎样拿,只要按照规则,一定 会使Nim-Sum不为0;如果Nim-Sum不为0,下一个人一定有一种 拿石子的方法可以让Nim-Sum变成0。
减法游戏-例
例:S = {1, 3, 4},如果在游戏的开始有100枚 石子,那么哪个玩家获胜?
减法游戏-例
使用向后归纳的方法,可以计算出游戏的P位置 和N位置如下: X: 0 1 2 3 4 ... Position: P N P N N N N P N P N ... N N 5 6 7 8 9 10 11 12
P位置和N位置的计算
在普通博弈游戏(Misère游戏类似)中,P位置 和N位置的计算方法如下:
把所有的结束位置标记为P位置; 把能够一步移动到P位置的位置标记为N位置; 把通过一步只能移动到N位置的位置标记为P位置; 如果在上一步没有位置被标记为P位置,算法结束; 否则,转到第二步。

博弈论入门-取石子游戏

博弈论入门-取石子游戏

博弈论⼊门-取⽯⼦游戏
引导游戏
1. 玩家:2⼈
2. 道具:23张扑克牌
3. 规则: - 游戏双⽅轮流取牌 - 每⼈每次仅限于取1张、2张或3张 - 扑克牌取光,则游戏结束 - 最后取牌的⼀⽅为赢家。

什么是组合游戏?
- 有两个玩家 - 游戏的操作状态是⼀个有限的集合(⽐如:限定⼤⼩的棋盘) - 游戏双⽅轮流操作 - 双⽅的每次操作必须符合游戏规定 - 当以放不能将游戏继续进⾏时,游戏结束,同时,对⽅为获胜⽅ - ⽆论如何操作,游戏总能在有限次操作后结束
概念:必胜点N和必败点P
必胜点(N):下⼀个选⼿将取胜的位置称为必胜点。

必败点(P):前⼀个选⼿将取胜的位置称为必败点。

必胜点N和必败点P属性:
- 所有终结点时必败点P - 从任何必胜点操作,⾄少有⼀种⽅法可以进⼊必败点 - ⽆论如何操作,从必败点都只能进⼊必胜点
取⼦游戏算法实现:
- 步骤⼀:将所有终结位置标记为必败点 - 步骤⼆:将所有⼀步操作能进⼊必败点的位置标记为必胜点 - 步骤三:如果从某个点开始的所有⼀步操作都只能进⼊必胜点,则将该店标记为必败点 - 步骤四:如果在步骤三未能找到新的必败点,则算法终⽌,否则返回步骤⼆。

-
栗⼦:
set:1 3 4
x:0 1 2 3 4 5 6 7 8 9 10 11 12 13
k:p n p n n n n p n p n n n n。

取石子游戏

取石子游戏

从三道例题来看一类常见博弈问题的思维方法。

长郡中学金恺在博弈问题中,有一类最为一般与常见,概括来说满足4个基本要点:1、双人轮流取子,输赢只与当前的局面有关,而与之前怎么取的无关;2、取子的方法可以是多种不同的取法相结合。

13、某个人无法按规则取了就算输——即没有后继状态的状态为败局;4、石子越取越少,或者存在某种特殊的性质,使得状态不可能出现循环——状态存在拓扑顺序,能够采用递推的方法解决(但效率不高,因为没有利用走棋规则的特点);对于这类博弈题,我们往往希望根据走棋特点找到一种简单的性质,然后根据这个性质将Array所有状态进行划分:即将所有状态分为两部分W、L,满足性质A的状态划到集合L,不满足性质A的状态划到集合W:对于集合L中的状态l,证明l的后继状态都在W中;对于集合W中的状态w,证明w至少有一个后继在L中。

则W中的所有状态都是胜局,L中的所有状态都是败局。

对于输入的一个状态,只要判断它是否满足性质A即可以知道它是胜是败。

但是性质A可能非常隐蔽、复杂,要找到性质A可能却要花费很多时间和心智。

这类问题由于取子方法有很多很多,所以没有约定俗成的公式2。

抓住取子方法的特点、周密深入的分析、找到问题的本质是解决这类问题的最直接的办法。

在很多情况下,找规律也是一个不错的选择,因为大多数情况下性质A的形式是非常简单的(这正体现了数学中简单即美的最高境界),往往可以通过观察+猜想找到正确的结果。

而一旦找到了某个性质A对于小数据都成立(可用程序检测),那么用归纳法证明是比较简单的。

本文就通过几个例子,来探索解决这类问题的思维方法。

问题1:取火柴游戏题目来源:姚金宇原创题目描述:有三堆火材,分别为a,b,c根。

有两个人在做如下游戏:游戏者任意拿走其中一堆火柴,再在剩下的两堆里任取一堆任意分成两堆(每堆至少1根)。

两人轮流如此,谁无法这样做就算输了。

输入格式:有n组数据:每一行三个数a,b,c,满足1≤a,b,c≤1,000,000,000。

若干取石子问题

若干取石子问题

若⼲取⽯⼦问题⼏道取⽯⼦游戏【前⾔】取⽯⼦游戏是⼀类经典的博弈问题,也是博弈问题SG函数的基础所在。

⽽它也具有⼀般博弈题的思维难度较⼤、编程量⼩等特点,因此在⽐赛时的得分情况往往呈现出两边倒的情况。

⽽其游戏的结论却经常是浅显易懂但⼜难以捉摸的,往往在⽐赛结束后,经过别⼈的⼏句话就使⼈恍然⼤悟。

本⽂将对⼏道取⽯⼦的游戏进⾏讨论,并分析思维的过程,希望读者能从中获益。

⾸先我们先来回顾⼀下最原始的取⽯⼦游戏。

即:有N堆⽯⼦,每次可以从任意⼀堆中取出若⼲⽯⼦,不能不取,两⼈轮流⾏动,最先⽆⽯⼦可取的⼈输。

⽽解决此题的⽅法便是把这N堆⽯⼦的个数进⾏异或操作,得到的值为0即为先⼿必败,否则先⼿必胜。

关于这⼀问题可以参考相关⽂献。

但仅仅靠这个模型并不能满⾜我们的要求,⾯对⼀些进⾏过变形的题⽬需要我们灵活运⽤。

下⾯我们先来看⼀个例题。

【例题1】POIXVI Stage I Pebbles题⽬⼤意:有N堆⽯⼦,开始时⽯⼦个数为A1,A2…A N。

(从左到右编号)并满⾜A1≤A2≤…≤A N,即⽯⼦个数为⾮递减数列。

两⼈轮流取⽯⼦,每次可以在任意⼀堆中取任意多个,不能不取,并且必须保证每次取完后的⽯⼦个数仍为⾮递减。

最先不能取的输。

问题分析:很显然,这道题在普通的取⽯⼦游戏上加了⼀个限制,即必须保持⽯⼦数为⾮递减数列。

这样我们便不能直接⽤原来的性质,⽽状态数也⾮常⼤,只能考虑通过⼀步步分析把问题转化。

⾸先,我们先来研究⼀些简单的情况:显然N=1时先⼿必胜。

⽽N=2时,可以发现当A1= A2时,先⼿必败,因为此时先⼿不能取A2的⽯⼦,只能在A1中取x个⽯⼦。

⽽后⼿者只需跟随先⼿者,同样在A2中取出x个即可满⾜保持A1’= A2’。

当A1< A2时,则先⼿可以从A2中取⾛A2- A1个⽯⼦。

因此先⼿必胜。

经过这个简单的分析,我们可以感觉到,由于要保证⾮递减的性质,在相邻的两堆中,可能经常会有类似N=2时的博弈发⽣。

取石子问题

取石子问题

取石子问题有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。

两个人轮流从堆中取物体若干,规定最后取光物体者取胜。

这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。

下面我们来分析一下要如何才能够取胜。

(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。

最后取光者得胜。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。

因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。

总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。

(二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

这种情况下是颇为复杂的。

我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。

前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而bk= ak + k,奇异局势有如下三条性质:1。

任何自然数都包含在一个且仅有一个奇异局势中。

由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而bk= ak + k > ak-1 + k -1 = bk-1 > ak-1 。

取石子游戏

取石子游戏

取石子游戏简介取石子游戏是一种古老且经典的游戏,通常在孩子们之间进行。

这个游戏的目标是通过每一步的策略来获得尽可能多的石子。

在这个游戏中,两个玩家轮流从一堆石子中取出石子,每次取的数量可以是任意正整数,但不能超过规定的最大值。

最后,拿到最多石子的一方将获胜。

游戏规则1.游戏开始时,准备一堆石子。

这种游戏一般使用小石子或棋子来代表石子。

2.两个玩家轮流进行操作,根据规定的规则取石子。

3.每一步,玩家可以从堆中取出任意数量的石子,但不能超过规定的最大值。

4.游戏继续直到没有石子可供取出。

5.最后,拿到最多石子的一方将获胜。

游戏策略在取石子游戏中,玩家之间进行的是一种全信息博弈。

这意味着玩家可以完全了解整个游戏状态,包括对手的策略和目标。

因此,玩家可以通过一定的策略来优化自己的收益。

基本策略保证胜利的策略如果游戏的规则允许,玩家可以通过以下策略保证胜利:1.规定每次取石子的数量为1个,那么先手的玩家总是可以取到最后一个石子,从而获胜。

2.如果规定每次取石子的数量有上限,而且堆中的石子数量是该上限的倍数加1,那么先手的玩家总是可以通过合理的策略来使得每一步的石子数量维持在上限倍数上,从而保证最后一个石子留给对方。

最优策略对于一般的取石子游戏,玩家可以通过数学方法找到最优策略。

最佳策略取决于堆中石子的数量和规定的最大取石子数量。

例如,假设堆中有13个石子,规定一次最多取5个石子。

通过计算,可以得出以下最佳策略:•如果堆中石子数量是5的倍数加1,先手的玩家会输。

•如果堆中石子数量是5的倍数,先手的玩家会赢。

通过数学分析,可以得出结论:对于先手玩家,在石子数量是(m×n+1)的情况下,先手玩家会输;在石子数量是m×n的情况下,先手玩家会赢。

其中m和n是任意正整数,n是规定的规则中每一次最大取石子的数量。

取石子游戏的变种取石子游戏有许多变种,可以根据玩家的喜好和游戏的目标来选择。

Nim游戏在Nim游戏中,有几堆石子,两个玩家轮流进行操作,每次可以从一堆石子中取出任意数量的石子。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一局游戏在两个游戏人之间如下交替进行:游戏从一空堆开始。

当轮到一个游戏人时,他可以往堆中加进1,2,3或4枚硬币。

往堆中加进第100枚硬币的游戏人为得胜者。

确定在这局游戏中是游戏人A还是游戏人B能够确保取胜。

取胜的策略是什么?在学术论坛有博士家园,组合图论论坛确保取足5个硬币即可例题:两个人玩移火柴的游戏,桌子上有1000根火柴,每个人每次可以拿走1-7根火柴,拿走桌子上最后那根火柴的算输,问第一个人第一次要拿多少根火柴才能保证赢7根。

以后对方拿几根,你都要拿够凑足8根的数。

1000根和8根性质是一样的。

从抢30到NIM游戏的取胜策略(一)倒推法抢30是我国民间的一个两人游戏,具有很强的对抗性和娱乐性。

抢30游戏通常有两种玩法。

(1)两人从1开始轮流报数,每人每次可报一个数或两个连续的数,谁先报到30,谁就为胜方。

(2)两人从1开始轮流报数,每人每次可报一个数或两个连续的数,同时把两个人报出的所有数累加,谁先使这个累加数最先达到30,谁就为胜方。

解决最个问题的一般策略是用倒推法。

以(1)为例,要抢到30,必须抢到27;要抢到27,必须抢到24。

如此倒推回去,可得到一系列关键数30、27、24、21、18、……9、6、3。

根据以上分析,抢30游戏本身并不是一个公平的游戏,初始数和先后顺序已经决定了最后的结果,因为只有后报数者才能抢到3的倍数,后报数者有必胜策略。

(二)关键因子所有这些关键数都是3的倍数。

3是两个报数者年内能够报出的最大数与最小数的和。

在类似游戏中,我们把游戏者所能用到的最大数和最小数之和称之为关键因子k,关键数就是k的倍数.。

在抢30的游戏中,关键因子k等于3。

又例如,抢100报数游戏中,如果每人可报数为1至9个连续的自然数,谁先报到100谁就是胜利者。

这里的关键因子k就是可报最大数9和可报最小数1的和,即k=10。

报数获胜的策略就是:(1)让对方先报数;(2)每次报数为关键因子减去对方所报数。

这样自己每次所报数都是关键数。

如果对方一定要先报,你只能期待对方不懂策略或者大意出错了。

(三)不平衡因子在上述的抢30或者抢100的游戏中,最后数30是关键因子3的整数倍,最后数100是关键因子10的整数倍。

我们可以把这样的游戏称为平衡游戏,也就是最后报数与关键因子相除余数为0。

如果最后报数与关键因子相除有余数,这个游戏就可以称为不平衡游戏,其余数就是不平衡因子。

抢数不平衡游戏也是不公平的游戏,先报数者有必胜策略。

先报数者的获胜策略就是先消除不平衡因子,使其变成一个平衡游戏,先报数者随后就成为平衡游戏的后报数者。

例如,在抢30游戏中,两人从1开始轮流报数,每人每次可报1到3个连续的数,谁先报到30,谁就为胜方。

在这里,关键因子是4,不平衡因子是2。

又例如,抢100报数游戏中,如果每人可报数为1至10个连续的自然数,谁先报到100谁就是胜利者。

在这里,关键因子是11,不平衡因子是1。

在不平衡游戏中,如果先报数者不懂得游戏策略,懂得这个策略的后报数者需要不断计算不平衡因子,以便最后获胜。

(四)更多例子报数游戏里的最后数都是些比较小的数,因此用倒推法比较容易得到策略。

当我们把数变得大一些的时候,就变成了小学奥赛题。

如果掌握上述讨论中的关键因子和不平衡因子的计算,奥数题也变得迎刃而解了。

下面就是两个奥数例题。

(1)2008个空格子排成一排,第一格放有一个棋子。

两人做游戏,轮流移动这枚棋子。

每个人每次可前移1到5个格子,谁先把棋子移到最后一格,谁就是获胜者。

问怎样的策略才能保证获胜。

(2)桌上放着一堆火柴,共有5000根。

两个人轮流从中取火柴,每人每次取的火柴根数为1到8根,谁取了最后一根谁就输。

问怎样的策略才能保证获胜。

(五)进一步扩展到NIM游戏抢30的游戏是中国NIM游戏(也叫筹码游戏)的一种特例。

NIM游戏的一种经典表述为:有n堆火柴,每堆各有若干根。

两人轮流取出火柴,每次取出的根数不限但至少取1根,每次也只能从1堆里取火柴。

谁最后把火柴取完,谁就是获胜者。

问如何才能保证获胜。

获胜策略已由美国数学家C.L.Bouton分析完成,用到的是二进制和平衡状态概念。

其结论是:如果一开始火柴的总根数转化成二进制后各位数上的数字和都是偶数时,则是平衡状态,后取者必胜。

最简单的平衡态是(1,1),即2堆火柴,每堆各1根。

如果开始时火柴的状态处于不平衡状态,先取者必胜,其策略是取完后使火柴根数保持为平衡状态。

最简单的不平衡态是(1),即1根火柴。

例如,2堆火柴数都为2根,二进制记为(10,10),各位数之和为20,这是一个平衡态,则后取者必胜。

3堆火柴数分别为1根、2根、1根,二进制记为(1,10,1),各位数之和为12,这不是一个平衡态。

先取者先取掉中间一堆2根火柴,变成平衡状态(1,1),则先取者必胜。

下面的一道例题,可以用来练习NIM游戏的上述策略:有3堆火柴,根数分别为12、9、6.。

甲乙两人轮番从其中一堆中取出1根或几根火柴,取到最后一根者获胜。

先取者还是后取者有必胜策略,如何取胜?Nim游戏Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。

满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素;4、如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。

根据这个定义,很多日常的游戏并非ICG。

例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。

通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

这游戏看上去有点复杂,先从简单情况开始研究吧。

如果轮到你的时候,只剩下一堆石子,那么此时的必胜策略肯定是把这堆石子全部拿完一颗也不给对手剩,然后对手就输了。

如果剩下两堆不相等的石子,必胜策略是通过取多的一堆的石子将两堆石子变得相等,以后如果对手在某一堆里拿若干颗,你就可以在另一堆中拿同样多的颗数,直至胜利。

如果你面对的是两堆相等的石子,那么此时你是没有任何必胜策略的,反而对手可以遵循上面的策略保证必胜。

如果是三堆石子……好像已经很难分析了,看来我们必须要借助一些其它好用的(最好是程式化的)分析方法了,或者说,我们最好能够设计出一种在有必胜策略时就能找到必胜策略的算法。

定义P-position和N-position,其中P代表Previous,N代表Next。

直观的说,上一次move的人有必胜策略的局面是P-position,也就是“后手可保证必胜”或者“先手必败”,现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”。

更严谨的定义是:1.无法进行任何移动的局面(也就是terminal position)是P-position;2.可以移动到P-position的局面是N-position;3.所有移动都导致N-position的局面是P-position。

按照这个定义,如果局面不可能重现,或者说positions的集合可以进行拓扑排序,那么每个position或者是P-position或者是N-position,而且可以通过定义计算出来。

以Nim游戏为例来进行一下计算。

比如说我刚才说当只有两堆石子且两堆石子数量相等时后手有必胜策略,也就是这是一个P-position,下面我们依靠定义证明一下(3,3)是一个P是一个P是一个P-position。

首先(3,3)的子局面(也就是通过合法移动可以导致的局面)有(0,3)(1,3)(2,3)(显然交换石子堆的位置不影响其性质,所以把(x,y)和(y,x)看成同一种局面),只需要计算出这三种局面的性质就可以了。

(0,3)的子局面有(0,0)、(0,1)、(0,2),其中(0,0)显然是P-position,所以(0,3)是N-position (只要找到一个是P-position的子局面就能说明是N-position)。

(1,3)的后继中(1,1)是P-position(因为(1,1)的唯一子局面(0,1)是N-position),所以(1,3)也是N-position。

同样可以证明(2,3)是N-position。

所以(3,3)的所有子局面都是N-position,它就是P-position。

通过一点简单的数学归纳,可以严格的证明“有两堆石子时的局面是P-position当且仅当这两堆石子的数目相等”。

根据上面这个过程,可以得到一个递归的算法——对于当前的局面,递归计算它的所有子局面的性质,如果存在某个子局面是P-position,那么向这个子局面的移动就是必胜策略。

当然,可能你已经敏锐地看出有大量的重叠子问题,所以可以用DP 或者记忆化搜索的方法以提高效率。

但问题是,利用这个算法,对于某个Nim游戏的局面(a1,a2,...,an)来说,要想判断它的性质以及找出必胜策略,需要计算O(a1*a2*...*an)个局面的性质,不管怎样记忆化都无法降低这个时间复杂度。

所以我们需要更高效的判断Nim游戏的局面的性质的方法。

直接说结论好了。

(Bouton's Theorem)对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。

怎么样,是不是很神奇?我看到它的时候也觉得很神奇,完全没有道理的和异或运算扯上了关系。

但这个定理的证明却也不复杂,基本上就是按照两种position的证明来的。

根据定义,证明一种判断position的性质的方法的正确性,只需证明三个命题:1、这个判断将所有terminal position判为P-position;2、根据这个判断被判为N-position的局面一定可以移动到某个P-position;3、根据这个判断被判为P-position 的局面无法移动到某个P-position。

第一个命题显然,terminal position只有一个,就是全0,异或仍然是0。

第二个命题,对于某个局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。

相关文档
最新文档