ACM-ICPC中博弈论的一些小小总结

博弈论

参考

[1]https://blog.csdn.net/clover_hxy/article/details/53818624
[2]https://blog.csdn.net/foreyes_1001/article/details/82862324
[3]https://www.cnblogs.com/lxm940130740/p/3268803.html

一.尼姆博弈


问题提出

下面给出Nim游戏的三种变体

  1. 现有 n n n堆石子,每人每次可以从其中选出一堆,取 1 ≤ x ≤ k 1 \le x \le k 1xk颗石子,最后一人取完获胜,如何判断先手必胜还是必败?
  2. 现有 n n n堆石子,每人每次可以从其中选出至多 k k k堆,每堆中可以取任意颗石子,最后一人取完获胜,如何判断先手必胜还是必败?
  3. 现有 n n n堆石子,没人每次可以从选 1 1 1堆,并从这一堆中取任意数量的石子,最后一人取完失败,如何判断先手必胜还是必败?

其中第 3 3 3种情况也被叫做 a n t i − n i m anti-nim antinim游戏.

解决方法

  1. 这种变体比较简单,只需要把每一堆的石子个数模上 k + 1 k+1 k+1,然后当成一般的 N i m Nim Nim游戏来玩即可.
    因为必胜态的一方总可以将败方操作的使得模数改变的一堆再改变回来.例如 A l i c e Alice Alice改变了某一堆得石子使得模数从 x 1 − > x 2 x_1 ->x_2 x1>x2了,而如果当前堆得石子个数仍然 ≥ k + 1 \ge k+1 k+1,那么 B o b Bob Bob可以取 k + 1 − ( x 1 − x 2 ) k+1-(x_1-x_2) k+1(x1x2)个,使得模数重回 x 1 x_1 x1.
    当然也可以这样解释,每堆石子当做是一个独立的游戏,而每个独立游戏的 S G SG SG函数计算方法为 S G ( x ) = x % ( m + 1 ) SG(x) = x \% (m+1) SG(x)=x%(m+1)

  2. 这种变体相对复杂一些,但解决方案也很简单,就是将每堆石子的个数以二进制的形式表示,并统计每一位上为 1 1 1的石子堆个数 s u m sum sum,如果每一位统计的个数 s u m sum sum都可以被 k + 1 k+1 k+1整除,那么先手必败,否则先手必胜.
    这个证明起来相对复杂一些.
    [1]从每一位的 s u m % ( k + 1 ) = 0 sum \% (k+1) = 0 sum%(k+1)=0的状态,一定会转移到有一位 s u m % ( k + 1 ) ≠ 0 sum \% (k+1)\ne 0 sum%(k+1)̸=0的状态:这是因为最多可以对 k k k堆石子进行操作,而每次操作至少使得一堆的某一位二进制位受到影响.在这一位上最多只能改变 k k k堆,因为这一位的 s u m sum sum一定不会被 k + 1 k+1 k+1整除.
    [2]从 s u m % ( k + 1 ) ≠ 0 sum \% (k+1) \ne 0 sum%(k+1)̸=0的状态一定可以转移到任何一位 s u m % ( k + 1 ) = 0 sum\%(k+1)=0 sum%(k+1)=0的状态:我们从高位向低位考虑,假设之前考虑的所有位都已经满足条件,且操作了 1 ≤ m ≤ k 1\le m \le k 1mk堆(由于这 m m m堆的高位二进制已经被操作过了,所以这m堆低位的二进制位我们可以随意改变).我们当前位的 s u m sum sum( s u m sum sum即除掉之前操作的 m m m堆,剩下的堆中该二进制位为 1 1 1的统计个数):(1)如果 s u m ≤ k − m sum \le k-m sumkm,显然可以将这些 1 1 1位全部置位 0 0 0, m = m + s u m m= m + sum m=m+sum.(2)如果 s u m > k − m sum \gt k-m sum>km,则我们从 m 堆 中 选 取 k + 1 − s u m m堆中选取k+1-sum mk+1sum堆置为 1 1 1, m m m堆剩下的置为 0 0 0即可,着一定是可行的,因为 k + 1 − s u m ≤ m k+1-sum \le m k+1summ.

  3. a n t i − n i m anti-nim antinim博弈我们只需要记住两个必胜态的条件就可以了,详细证明可以看参考博客.
    [1]当石子个数全部为 1 1 1,且 n i m = 0 nim = 0 nim=0时.
    [2]当至少有一堆石子个数大于 1 1 1 n i m ≠ 0 nim \ne 0 nim̸=0时.


二.转化为NIM博弈

问题提出

一个 100 ∗ 100 100*100 100100的棋盘,坐标范围是 [ 0 , 100 ] [0, 100] [0,100]的,上面有n个棋子。Alice 和 Bob轮流操作,每次操作可以把一枚棋子向左或者向下或者向斜下方移动任意步,也就是 ( x , y ) (x,y) (x,y)有这三种移动 ( x − l , y ) , ( x , y − l ) , ( x − l , y − l ) (x-l, y), (x, y-l), (x-l, y-l) (xl,y),(x,yl),(xl,yl)。多个棋子可以同时在同一位置。第一个把棋子移动到 ( 0 , 0 ) (0, 0) (0,0)点的人获胜。 问是否先手必胜。

解决方法

这并非直接的 N i m Nim Nim游戏,因为 N i m Nim Nim游戏中必胜态的定义是最后一个人将棋子移动到 ( 0 , 0 ) (0,0) (0,0),而这个游戏中要求的必胜态是第一个将棋子移动到 ( 0 , 0 ) (0,0) (0,0)的人获胜.
假设一开始所有的棋子都不在 ( 0 , x ) , ( x , 0 ) , ( x , x ) (0,x),(x,0),(x,x) (0,x),(x,0),(x,x)这三条直线之一,否则这个人必胜.
如果某个人将棋子移动到 ( 0 , x ) , ( x , 0 ) , ( x , x ) (0,x),(x,0),(x,x) (0,x),(x,0),(x,x)中任意一条直线上,那么这个人将失败,因此他绝对不可以将棋子移动到这三条直线中去.因此,每个棋子的可移动范围相当于增加了一个限制.实际上也就是棋子的 s g sg sg函数计算方法改变了.当一方不能移动棋子的时候,便输了.这也就通过改变 s g sg sg函数计算方法成功转化成为经典的 N i m Nim Nim博弈了.


三.巴什博弈

问题提出

只有 1 1 1堆石子,每次至多取 k k k个,至少取 1 1 1个,最后一个取完获胜.

解决方法

如果石子数能被 k + 1 k+1 k+1整除,则先手必败,否则必胜.
这是显然的因为模数为 0 0 0,无论取多少个都会使得模数不为 0 0 0.而模数为 t > 0 t > 0 t>0时候,只要下一个人取走 t t t就会使得模数重回 0 0 0.

上述 N i m Nim Nim博弈中的第一个问题可以看成是巴什博弈和 N i m Nim Nim博弈的结合.


四.阶梯尼姆游戏

问题提出

在一个阶梯上,每层有若干个石子,每次可以将某一层中若干个石子移动到他下一层阶梯中去.问先手是否必胜.

解决方案

我们可以认为从奇数阶梯移动到偶数阶梯相当于是把石子从奇数阶梯拿走.这样就转化为了奇数堆的取石子游戏.
对于从偶数阶梯拿走到奇数阶梯的石子,我们可以对称地从那个奇数阶梯中拿走相等的石子到下一个偶数阶梯中去,相当于抵消掉了从偶数阶梯拿石子的操作.因为每个奇数阶梯下都有一个偶数阶梯,因此可以保证我们的操作总是可以进行.


五.取走-分割游戏

问题提出

这类游戏允许取走若干东西,也允许将原来的一个游戏分隔成为几个游戏.
例:定义有如下操作的游戏:
[1]从一堆中取走任意个数的石子.
[2]将一堆石子分成两堆不为空的石子.

解决方案

这类问题也容易解决,只要稍微注意一下 s g sg sg函数的计算即可,最后求 N i m Nim Nim和即可.
例如 s g ( 5 ) sg(5) sg(5)的后继有
s g ( 0 ) , s g ( 1 ) , s g ( 2 ) , s g ( 3 ) , s g ( 4 ) , s g ( 1 ) ⨁ s g ( 4 ) , s g ( 2 ) ⨁ s g ( 3 ) sg(0),sg(1),sg(2),sg(3),sg(4),sg(1) \bigoplus sg(4),sg(2)\bigoplus sg(3) sg(0),sg(1),sg(2),sg(3),sg(4),sg(1)sg(4),sg(2)sg(3)
在这些后继中找最小的未出现过的自然数,即 s g ( 5 ) sg(5) sg(5)的值.

小结论:对于所有的 k ≥ 0 k \ge 0 k0,有 g ( 4 k + 1 ) = 4 k + 1 ; g ( 4 k + 2 ) = 4 k + 2 ; g ( 4 k + 3 ) = 4 k + 4 ; g ( 4 k + 4 ) = 4 k + 3 g(4k+1)=4k+1;g(4k+2)=4k+2;g(4k+3)=4k+4;g(4k+4)=4k+3 g(4k+1)=4k+1g(4k+2)=4k+2g(4k+3)=4k+4g(4k+4)=4k+3


六.寻找必败态解题

问题描述

n n n堆石子,每次可以选定一堆石子,取走任意颗,然后从该堆剩下的石子中取走任意颗放在任意未取完的堆中,无法操作的人失败.

解决方案

[1]当 0 0 0堆时显然必败.
[2]当只有 1 1 1堆时,显然必胜.
[3]当只有 2 2 2堆时,如果全都相等,那么必败,否则必胜.
[4]当只有 3 3 3堆时,必胜,因为总可以操作数量最多的石子堆,使得只剩下两堆且石子个数相同.
[5]当只有 4 4 4堆时,如果有有两组各个组内石子数相同的情况,则必败,否则必胜.因为四堆两两相同的情况下,要么转移到 3 3 3堆(必胜态),要么转移成四堆不存在两两相同,而此时,对方总可以再转移到四堆两两相同的情况.

规律:偶数堆,且可以分成 n 2 \frac{n}{2} 2n组组内两两相同的情况必败.其他情况必胜.

证明:只要证明必胜态总可以转移到必败态以及必败态无论如何都会转移到比必败态即可,证明相对来说较为容易.

另一个问题 Wannafly H.树链博弈

给出一颗树,树上的节点非黑即白,每次可以选定一个黑色结点将其变白,并且从该黑色结点到根的路径上所有点的颜色都可以任意设置.给出必胜局态的策略.

问题解答

[1]当只有根节点黑色时候,先手必胜
[2]当有 3 3 3个节点的树,两个叶子节点为黑色时候,根节点为白色的时候,先手必败.
[2]当有 3 3 3个节点的树,两个叶子节点为黑色时候,根节点为黑色的时候,先手必胜.

我们可以猜测,任意深度的黑色结点个数为偶数的时候,必败,其他状态都是必胜态.

证明:
[1]当存在深度为 x x x的黑色结点个数为奇数时,这是个必胜态.因为我们取(最大的 x x x)层的一个黑色节点,将其设置为白色.并且沿路改变路径上点的颜色,总能使得所有深度下,黑色结点的个数为偶数.证明了必胜态总有一种方法可以转移到必败态.
[2]当所有深度为 x x x的黑色结点个数都是奇数时,无论选择哪个深度的黑色结点将其染白,该层黑色结点的个数将回归奇数.证明了必败态无论如何都会转移到必胜态.
[3]无法移动的情况即黑色结点个数为 0 0 0,根据我们的定义满足必败态的条件.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值