有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个
人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏
,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够
取胜。
(一) 巴什博奕(Bash Game): 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(k≤m)个,那么先取者再拿走m+1−k个,结果剩下(m+1)(r−1)个,以后保持这样的取法,那么先取者肯定获胜。总之,只要保持给对手留下(m+1)的倍数,就能最后获胜。 显 然 , 如 果 n = m + 1 , 那 么 由 于 一 次 最 多 只 能 取 m 个 , 所 以 , 无 论 先 取 者 拿 走 多 少 个 , 后 取 者 都 能 够 一 次 拿 走 剩 余 的 物 品 , 后 者 取 胜 。 因 此 我 们 发 现 了 如 何 取 胜 的 法 则 : 如 果 n = ( m + 1 ) r + s , ( r 为 任 意 自 然 数 , s ≤ m ) , 那 么 先 取 者 要 拿 走 s 个 物 品 , 如 果 后 取 者 拿 走 k ( 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)。 这 种 情 况 下 是 颇 为 复 杂 的 。 我 们 用 ( a k , b k ) ( a k ≤ b k , 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,奇异局势有如下三条性质: 可 以 看 出 , a 0 = b 0 = 0 , a k 是 未 在 前 面 出 现 过 的 最 小 自 然 数 , 而 b k = a k + k , 奇 异 局 势 有 如 下 三 条 性 质 :
1、任何自然数都包含在一个且仅有一个奇异局势中。
由于ak是未在前面出现过的最小自然数,所以有ak>ak−1,而bk=ak+k>ak−1+(k−1)=bk−1>ak−1。所以性质1。成立。 由 于 a k 是 未 在 前 面 出 现 过 的 最 小 自 然 数 , 所 以 有 a k > a k − 1 , 而 b k = a k + k > a k − 1 + ( k − 1 ) = b k − 1 > a k − 1 。 所 以 性 质 1 。 成 立 。
2、任意操作都可将奇异局势变为非奇异局势。
事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。 事 实 上 , 若 只 改 变 奇 异 局 势 ( a k , b k ) 的 某 一 个 分 量 , 那 么 另 一 个 分 量 不 可 能 在 其 他 奇 异 局 势 中 , 所 以 必 然 是 非 奇 异 局 势 。 如 果 使 ( a k , b k ) 的 两 个 分 量 同 时 减 少 , 则 由 于 其 差 不 变 , 且 不 可 能 是 其 他 奇 异 局 势 的 差 , 因 此 也 是 非 奇 异 局 势 。
3、采用适当的方法,可以将非奇异局势变为奇异局势。
假设面对的局势是(a,b),
如果a=b,则同时从两堆中取走a个物体,就变为了奇异局势(0,0); 如 果 a = b , 则 同 时 从 两 堆 中 取 走 a 个 物 体 , 就 变 为 了 奇 异 局 势 ( 0 , 0 ) ;
如果a=ak,b>bk,那么,取走b–bk个物体,即变为奇异局势; 如 果 a = a k , b > b k , 那 么 , 取 走 b – b k 个 物 体 , 即 变 为 奇 异 局 势 ;
如果a=ak,b<bk,则同时从两堆中拿走ak–ab+ak个物体,变为奇异局势(ab–ak,ab–ak+b–ak); 如 果 a = a k , b < b k , 则 同 时 从 两 堆 中 拿 走 a k – a b + a k 个 物 体 , 变 为 奇 异 局 势 ( a b – a k , a b – a k + b – a k ) ;
如果a>ak,b=ak+k,则从第一堆中拿走多余的数量a–ak即可; 如 果 a > a k , b = a k + k , 则 从 第 一 堆 中 拿 走 多 余 的 数 量 a – a k 即 可 ;
如果a<ak,b=ak+k,分两种情况; 如 果 a < a k , b = a k + k , 分 两 种 情 况 ;
第一种,a=aj(j<k),从第二堆里面拿走b–bj即可; 第 一 种 , a = a j ( j < k ) , 从 第 二 堆 里 面 拿 走 b – b j 即 可 ;
第二种,a=bj(j<k),从第二堆里面拿走b–aj即可。 第 二 种 , a = b j ( j < k ) , 从 第 二 堆 里 面 拿 走 b – a j 即 可 。
从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。
那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
ak=k(1+√5)2,bk=ak+k(k=0,1,2,…,n方括号表示取整函数) a k = k ( 1 + √ 5 ) 2 , b k = a k + k ( k = 0 , 1 , 2 , … , n 方 括 号 表 示 取 整 函 数 )
奇妙的是其中出现了黄金分割数(1+√5)2=1.618...,因此,由ak,bk组成的矩形近似为黄金矩形,由于2(1+√5)=(√5−1)2,可以先求出j=a(√5−1)2,则判断bj=aj+j,若不等,那么就不是奇异局势。则先拿着必胜,否则后拿着必胜。 奇 妙 的 是 其 中 出 现 了 黄 金 分 割 数 ( 1 + √ 5 ) 2 = 1.618... , 因 此 , 由 a k , b k 组 成 的 矩 形 近 似 为 黄 金 矩 形 , 由 于 2 ( 1 + √ 5 ) = ( √ 5 − 1 ) 2 , 可 以 先 求 出 j = a ( √ 5 − 1 ) 2 , 则 判 断 b j = a j + j , 若 不 等 , 那 么 就 不 是 奇 异 局 势 。 则 先 拿 着 必 胜 , 否 则 后 拿 着 必 胜 。
(三) 尼姆博奕(Nimm Game): 有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。
计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示这种运算。这种运算和一般加法不同的一点是1+1=0。先看(1,2,3)的按位模2加的结果:
1 =二进制01
2 =二进制10
3 =二进制11 (+)
———————
0 =二进制00 (注意不进位)
对于奇异局势(0,n,n)也一样,结果也是0。
任何奇异局势(a,b,c)都有a(+)b(+)c =0。
如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?
假设 a < b < c,我们只要将 c 变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)[a(+)b] = [a(+)a](+)[b(+)b] = 0(+)0 = 0。
要将c 变为a(+)b,只要从 c中减去 c - [a(+)b]即可。
例1、(14,21,39),14(+)21=27,39-27=12,所以从39中拿走12个物体即可达到奇异局势(14,21,27)。
例2、(55,81,121),55(+)81 = 102,121-102 = 19,所以从121中拿走19个物品就形成了奇异局势(55,81,102)。
例3。(29,45,58),29(+)45=48,58-48=10,从58中拿走10个,变为(29,45,48)。
例4。我们来实际进行一盘比赛看看:
甲:(7,8,9)->(1,8,9)奇异局势
乙:(1,8,9)->(1,8,4)
甲:(1,8,4)->(1,5,4)奇异局势
乙:(1,5,4)->(1,4,4)
甲:(1,4,4)->(0,4,4)奇异局势
乙:(0,4,4)->(0,4,2)
甲:(0.4,2)->(0,2,2)奇异局势
乙:(0,2,2)->(0,2,1)
甲:(0,2,1)->(0,1,1)奇异局势
乙:(0,1,1)->(0,1,0)
甲:(0,1,0)->(0,0,0)奇异局势
甲胜。
(四) 取火柴的游戏:
题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。
题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为负,求必胜的方法。
先解决第一个问题吧。
定义:若所有火柴数异或为0,则该状态被称为利他态,用字母T表示;否则,为利己态,用S表示。
【定理1】:对于任何一个S态,总能从一堆火柴中取出若干个使之成为T态。
证明:
若有n堆火柴,每堆火柴有Ai根火柴数,那么既然现在处于S态,则 若 有 n 堆 火 柴 , 每 堆 火 柴 有 A i 根 火 柴 数 , 那 么 既 然 现 在 处 于 S 态 , 则
C=A1xorA2xor…xorAn>0; C = A 1 x o r A 2 x o r … x o r A n > 0 ;
把C表示成二进制,记它的二进制数的最高位为第P位, 把 C 表 示 成 二 进 制 , 记 它 的 二 进 制 数 的 最 高 位 为 第 P 位 ,
则必然存在一个At,它二进制的第P位也是1。 则 必 然 存 在 一 个 A t , 它 二 进 制 的 第 P 位 也 是 1 。
(否则,若所有的Ai的第P位都是0,则C的第P位也为0,与题意矛盾)。 ( 否 则 , 若 所 有 的 A i 的 第 P 位 都 是 0 , 则 C 的 第 P 位 也 为 0 , 与 题 意 矛 盾 ) 。
那么我们把X=AtxorC,则得到X<At。 那 么 我 们 把 X = A t x o r C , 则 得 到 X < A t 。
这是因为既然At的第P位与C的第P位同为1,那么X的第P位变为0,所以X<At; 这 是 因 为 既 然 A t 的 第 P 位 与 C 的 第 P 位 同 为 1 , 那 么 X 的 第 P 位 变 为 0 , 所 以 X < A t ;
而
A1xorA2xor…xorXxor…xorAn A 1 x o r A 2 x o r … x o r X x o r … x o r A n
=A1xorA2xor…xorAtxorCxor…xorAn = A 1 x o r A 2 x o r … x o r A t x o r C x o r … x o r A n
=A1xorA2xor…xorAnxorA1xorA2xor…xorAn = A 1 x o r A 2 x o r … x o r A n x o r A 1 x o r A 2 x o r … x o r A n
= 0
这就是说从At堆中取出At–X根火柴后状态就会从S态变为T态。 这 就 是 说 从 A t 堆 中 取 出 A t – X 根 火 柴 后 状 态 就 会 从 S 态 变 为 T 态 。
证毕
【定理2】:T态,取任何一堆的若干根,都将成为S态。
证明:
用反证法试试。
若
C=A1xorA2xor…xorAixor…xorAn=0; C = A 1 x o r A 2 x o r … x o r A i x o r … x o r A n = 0 ;
C′=A1xorA2xor…xorAi′xorCxor…xorAn=0; C ′ = A 1 x o r A 2 x o r … x o r A i ′ x o r C x o r … x o r A n = 0 ;
则有
CxorC′ C x o r C ′
=A1xorA2xor…xorAixor…xorA.nxorA1xorA2xor…xorAi′xorCxor…xorAn = A 1 x o r A 2 x o r … x o r A i x o r … x o r A . n x o r A 1 x o r A 2 x o r … x o r A i ′ x o r C x o r … x o r A n
=AixorAi′=0 = A i x o r A i ′ = 0
进而推出Ai=Ai′, 进 而 推 出 A i = A i ′ , 这与已知矛盾。
所以命题得证。
【定理 3】:S态,只要方法正确,必赢。
最终胜利即由S态转变为T态,任何一个S态,只要把它变为T态,(由【定理1】,可以把它变成T态。)对方只能把T态转变为S态【定理2】。这样,所有S态向T态的转变都可以有己方控制,对方只能被动地实现由T态转变为S态。故S态必赢。
【定理4】:T态,只要对方法正确,必败。
由【定理】3易得。
接着来解决第二个问题。
定义:若一堆中仅有1根火柴,则被称为孤单堆。若大于1根,则称为充裕堆。
定义:T态中,若充裕堆的堆数大于等于2,则称为完全利他态,用
T2
T
2
表示;
若充裕堆的堆数等于0(孤单堆数为偶数),则称为部分利他态,用
T0
T
0
表示。
孤单堆的根数异或只会影响二进制的最后一位,但充裕堆会影响高位(非最后一位)。一个充裕堆,高位必有一位不为0,则所有根数异或不为0。故不会是T态。
【定理5】: S0 S 0 态,即仅有奇数个孤单堆,必败。 T0 T 0 态必胜。
证明: S0态(孤单堆数一定为奇数),其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对方取,所以最后一根必己取。必败。同理, T0态,只有孤单堆,且堆数为偶数,则必胜。
【定理6】: S1 S 1 态,,即只有一个充裕堆,其他为孤单堆,只要方法正确,必胜。
证明:
若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由【定理5】,对方必输。己必胜。
证毕
【定理7】: S2 S 2 态,即充裕堆数大于等于二,其他为孤单堆,不可一次转变为 T0 T 0 态。
证明: 充裕堆数不可能一次由2变为0。得证。 #
【定理8】: S2 S 2 态可一次转变为 T2 T 2 态。
证明: 由【定理1】,S态可一次转变为T态,又由【定理7】, S2 S 2 态不可转一次变为 T0 T 0 态,所以转变为 T2 T 2 态。
【定理9】: T2 T 2 态,只能转变为 S2 S 2 态或 S1 S 1 态。
证明: 由【定理2】,T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的S态不可能为 S0 S 0 态。
命题得证。
【定理10】: S2 S 2 态,只要方法正确,必胜.
证明:
方法如下:
1) S2 S 2 态,就把它变为 T2 T 2 态。(由【定理8】)
2) 对方只能 T2 T 2 转变成 S2 S 2 态或 S1 S 1 态(【定理9】)
若转变为 S2 S 2 , 转向1)
若转变为 S1 S 1 , 己必胜。(【定理5】)
【定理11】: T2 T 2 态必输。
证明:同【定理10】。
综上所述,
必输态有:
T2,S0
T
2
,
S
0
必胜态有:
S2,S1,T0
S
2
,
S
1
,
T
0
两题比较:
第一题的全过程其实如下:
S2−>T2−>S2−>T2−>…..−>T2−>S1−>T0−>S0−>T0−>……−>S0−>T0(全0)
S
2
−
>
T
2
−
>
S
2
−
>
T
2
−
>
…
.
.
−
>
T
2
−
>
S
1
−
>
T
0
−
>
S
0
−
>
T
0
−
>
…
…
−
>
S
0
−
>
T
0
(
全
0
)
第二题的全过程其实如下:
S2−>T2−>S2−>T2−>……−>T2−>S1−>S0−>T0−>S0−>…..−>S0−>T0(全0)
S
2
−
>
T
2
−
>
S
2
−
>
T
2
−
>
…
…
−
>
T
2
−
>
S
1
−
>
S
0
−
>
T
0
−
>
S
0
−
>
…
.
.
−
>
S
0
−
>
T
0
(
全
0
)
表示胜利一方的取法。 是否发现了他们的惊人相似之处。
我们不难发现(见加黑部分),S1态可以转变为S0态(第二题做法),也可以转变为T0(第一题做法)。哪一方控制了S1态,他即可以有办法使自己得到最后一根(转变为T0),也可以使对方得到最后一根(转变为S0)。
我
们
不
难
发
现
(
见
加
黑
部
分
)
,
S
1
态
可
以
转
变
为
S
0
态
(
第
二
题
做
法
)
,
也
可
以
转
变
为
T
0
(
第
一
题
做
法
)
。
哪
一
方
控
制
了
S
1
态
,
他
即
可
以
有
办
法
使
自
己
得
到
最
后
一
根
(
转
变
为
T
0
)
,
也
可
以
使
对
方
得
到
最
后
一
根
(
转
变
为
S
0
)
。
所以,抢夺
S1
S
1
是制胜的关键!
为此,始终把
T2
T
2
态让给对方,将使对方处于被动状态,他早晚将把状态变为
S1
S
1
.
推荐HDOJ题目
http://acm.hdu.edu.cn/showproblem.php?pid=1907
http://acm.hdu.edu.cn/showproblem.php?pid=2509
看完上面的结论,就能顺利解决上面2道了
S-Nim
http://acm.hdu.edu.cn/showproblem.php?pid=1536
http://acm.hdu.edu.cn/showproblem.php?pid=1944
博弈算法入门小节 1536 1517 1907
小子最近迷途于博弈之中。。。感触颇深。
为了让大家能够在学习博弈的时候少走弯路,最重要的也是为了加深自己的影响,温故而知新,特发此贴与大家共勉。
学博弈先从概念开始:
特别推荐LCY老师的课件:博弈入门。
下载地址:http://acm.hdu.edu.cn/forum/read.php?tid=6875
这个课件个人认为从博弈的基本思想,一直到解博弈的中心算法做了很好的诠释。但是特别要注意的是。课件后面一部分英语写的讲义是重中之重。小子英语很弱,在这困扰很久。现在为大家大概介绍一下。
主要是后继点和SG值的问题:
SG值:一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数。
后继点:也就是按照题目要求的走法(比如取石子可以取的数量,方法)能够走一步达到的那个点。
具体的有关SG值是怎么运用的希望大家自己多想想。
看到这里推荐大家做几道题:
HDU1846(最简单的博弈水题)
HDU1847(求SG值)
有了上面的知识接下来我们来看看组合博弈(n堆石子)
看了这篇文章你会发现异或运算在博弈中使用的妙处。当然这里指出的只是组合博弈中一种特殊情况。
王道还是对SG值的求解,但是知道这么一种思路无疑对思维的广度和深度扩展是很有帮助的。
ZZ博弈
http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617
这里介绍了组和博弈的两种大的类型,一种是最后取的是N状态一种是最后取的是P状态,两个状态的解题方法能看懂很有帮助。当然,能够把推导过程理解,吃透无疑是大牛级的做法~小子也佩服的紧~