[学习笔记]Nim游戏&SG函数
SG函数
定义
- P-position(Previous): 当前选手的必败态
- N-position(Next): 当前选手的必胜态
状态转移方式
- 无路可走时是P-position
- 如果存在能让游戏状态变成P-position的走法,则当前状态为N-position
- 如果所有能到达的游戏状态都是N-position,则当前状态为P-position
性质
由状态转移方式推得
- 所有terminal position为P-position
- N-position的游戏状态一定可以转移到某个P-position
- P-position的游戏状态不可能转移到别的P-position
只要满足上面三条性质,则游戏状态合法.
应用
-
mex运算: 表示最小的不属于这个集合的非负整数
-
对游戏状态建DAG
-
SG函数f(x)=mex{f(y)|x->y\(\in\)DAG}
假设f(x)=0为必败态(P-position),反之为必胜态(N-position)- 所有terminal position无出边,f(x)=0
- f(x) \(\neq\) 0时,存在一条出边指向的y满足f(y) \(=\) 0
- f(x) \(=\) 0时,所有出边指向的y满足f(y) \(\neq\) 0
满足三条性质
Nim游戏及其变体
Nim Game
n堆石子, 两个人轮流操作, 每次可从任意一堆中取出任意多>0的石子, 无法操作者输.
- 结论:P-position为所有石子数的异或和=0.
- 证明:
-
terminal position,即石子数都为0,为P-position.
-
若当前为N-position,即异或和k(设最高位为x)不为0,则必存在石子数\(a_i\)的位x为1,满足\(a_i\;xor\;k<a_i\).
取\(a_i-a_i\;xor\;k\)即可.\(\begin{aligned}&a_1\;xor\;a_2\;xor...xor\;(a_i\;xor\;k)\;xor...xor\;a_n\\=&a_1\;xor\;a_2\;xor...xor\;a_i\;xor...xor\;a_n\;xor\;k\\=&k\;xor\;k\\=&0\end{aligned}\)
转移到了某个P-position.
-
若当前为P-position,即异或和为0,则无论怎么取,取后异或和必不为0,即不可能转移到别的P-position.
Nimk Game
n堆石子, 两个人轮流操作, 每次可从任意\(\small{\leq}\)k堆中取出任意多>0的石子, 无法操作者输.
- 结论:P-position为在二进制下,每一位上的1的个数和mod (k+1)都为0.
- 证明:
- terminal position,即石子数都为0,为P-position.
- 若当前为N-position,即存在某一位上的1的个数和mod (k+1)不为0,从高位往低位确定每堆石子取的个数.
假设已经使前i-1上的1的个数和mod (k+1)=0,现在考虑第i位.
对于已经改变的m堆,当前位可以自由选择变与不变(不会增加取的堆数).
记n为除已经改变的m堆外,当前位为1的堆数mod (k+1)的值.
若n+m\(\leq\)k,则直接全取这n+m堆这一位的1,m=n+m. 此时转移到了某个P-position.
否则,n+m>k即n+m\(\geq\)k+1,此时n\(\geq\)k+1-m,在这m堆中,留k+1-n堆这一位的1,其余1全取走. 此时转移到了某个P-position. - 若当前为P-position,即每一位上的1的个数和mod (k+1)都为0,则无论怎么取,取后必存在某一位上的1的个数和mod (k+1)不为0,即不可能转移到别的P-position.
Bash Game
n堆石子,两个人轮流操作,每次可从任意一堆中取出[1,m]个石子,无法操作者输.
-
结论:P-position为所有石子数\(mod\;(m+1)\)后的异或和=0.
-
证明:
-
terminal position,即石子数都为0,为P-position.
-
若当前为N-position,即异或和k(设最高位为x)不为0,则必存在石子数\(a_i\;mod\;(m+1)\)的位x为1,满足\(a_i\;mod\;(m+1)\;xor\;k<a_i\).
取\(a_i-a_i\;mod\;(m+1)\;xor\;k\)即可.\(\begin{aligned}&(a_1\;mod\;(m+1))\;xor...xor\;(a_i\;mod\;(m+1)\;xor\;k)\;xor...xor\;(a_n\;mod\;(m+1))\\=&(a_1\;mod\;(m+1))\;xor...xor\;(a_i\;mod\;(m+1))\;xor...xor\;(a_n\;mod\;(m+1))\;xor\;k\\=&k\;xor\;k\\=&0\end{aligned}\)
转移到了某个P-position.
-
若当前为P-position,即异或和为0,则无论怎么取,取后异或和必不为0,即不可能转移到别的P-position.
Staircase Nim
n阶台阶, 每次可以从一个台阶上拿掉任意数量石子放到下一层台阶, 无法操作者输(第1级可以往地面上放).
- 结论:P-position为所有奇数级的石子数的异或和=0.
- 证明:
- terminal position,即所有石子都在第0级,奇数级石子数异或和为0,为P-position.
- 若当前为N-position,即若当前奇数级异或和不为0,则必存在奇数级石子数\(a_i\)的位x为1,满足\(a_i\;xor\;k<a_i\). 取\(a_i-a_i\;xor\;k\)即可转移到某个P-position.
- 若当前为P-position,即若当前奇数级异或和为0,则移奇数级到偶数级后,奇数级异或和不为0,即不可能转移到别的P-position.
Anti Nim
n堆石子, 两个人轮流操作, 每次可从任意一堆中取出任意多>0的石子, 取走最后一颗石子的人输.
- 结论:N-Position为以下两种情况之一:
- 所有堆石子数都为1且堆数为偶数
- 存在某堆石子数大于1且石子堆的异或和≠0
- 证明 :
- terminal position,即只剩一个石子数为1的堆,为P-position.
- 若当前为N-position,
- 若所有堆石子数都为1且堆数为偶数,任取一堆即可转移到某个P-position.
- 若存在某堆石子数大于1且石子堆的异或和≠0,参考Nim Game,可转移到某个P-position.
- 若当前为P-position,
- 若所有堆石子数都为1且堆数为奇数,无论取哪堆都会转移到某个N-position,即不可能转移到别的P-position.
- 若存在某堆石子数大于1且石子堆的异或和=0,由异或和=0得至少存在两堆得石子数>1. 无论取哪堆都会使石子堆的异或和≠0(转移到某个N-position),即不可能转移到别的P-position.
2017-10-25 20:40:09