Nim 游戏类型
简介:
有两个玩家;
有n堆扑克牌(比如:有三堆,可以分别是 5,7,9张);
游戏双方轮流操作;
玩家的每次操作是选择其中某一堆牌,然后从中取走任意张;
最后一次取牌的一方为获胜方;
定义P-position和N-position,其中P代表Previous,N代表Next。直观的说,上一次move的人有必胜策略的局面是P-position,也就是“后手可保证必胜”或者“先手必败”,现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”。
x更严谨的定义是:1.无法进行任何移动的局面(也就是terminal position)是P-position;2.可以移动到P-position的局面是N-position;3.所有移动都导致N-position的局面是P-position.
nim-sum :
定义: 假设 (xm · · · x0)2 和(ym · · · y0)2 的nim-sum是(zm · · · z0)2,则我们表示成 (xm · · · x0)2 ⊕ (ym · · · y0)2 = (zm · · · z0)2, 这里,zk = (xk + yk) mod 2(k=0…m).
亦即异或运算。
按位异或运算符"^"是双目运算符。其功能是将参与运算的两操作数各对应的二进制位进行异或操作。只有对应的两个二进位不相同时,结果的对应二进制位才是 1,否则为 0。
例如:表达式“21 ^ 18 ”的值是 7(即二进制数 111)。
异或运算的特点是: 如果 a^b=c, 那么就有 c^b == a 以及 c^a==b。
结论:
对于一个Nim游戏的局面(a1,a2,...,an),它是P-position(必败点)当且仅当 a1^a2^...^an=0 反之,当a1^a2^...^an != 0 时是N-position(必胜点).
根据定义,证明一种判断position的性质的方法的正确性,只需证明三个命题: // 证明的重点
1、这个判断将所有terminal position判为P-position;
2、根据这个判断被判为N-position的局面一定可以移动到某个P-position;
3、根据这个判断被判为P-position的局面无法移动到某个P-position
证明1:结束位置(terminal position) 必然是P点(必败点)
证明2:对于某个局面(a1,a2,...,an),若a1^a2^...^an != 0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an = 0。
取出ai: 设: a1 ^ a2 ^ ... ^ ai-1 ^ ai+1 = k 将k转换成二进制不为零的数。 则定可找出一个 ai* 使k(2) ^ ai 变为 0. ai -> ai* (即合法的移动一步)
证明3: 对于某个局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。
假设成立,则有 a1 ^ a2 ^...^ ai ^ ... ^ an = 0 且 a1 ^ a2 ^...^ ai* ^ ... ^ an = 0
因为异或运算满足消去率,由a1^a2^...^an=a1^a2^...^ai*^...^an可以得到ai=ai*。所以将ai改变成ai*不是一个合法的移动。