[学习笔记]nim游戏
普通nim游戏:
n堆石子,每个人每次对着一堆拿若干个。不能拿者判输。
只有两种情况,先手必胜,先手必败。
先手必胜当且仅当:a1^a2^...^an!=0
证明:
设=x(x不为0),选择最高位和x一样的ai,显然有ai^x<ai
阶梯型nim游戏
阶梯型nim游戏:高度单调的阶梯。每次只能把a[i]中选择x个,放到a[i-1]中,或者把a[1]中扔掉若干个。问有无先手必胜策略。
等价于对奇数堆做nim游戏。
第一次先手,就把奇数堆按照必胜策略移动。偶数堆不管,当做垃圾桶。
如果后手移动奇数堆到偶数堆,就按照奇数堆必胜策略移动。
反之,就把后手移动过来x的奇数堆再往前移动x个。对于奇数堆的状态不变。早晚会把偶数堆移动完。
所以,等价。
反向nim游戏
有 N 堆石子,每次可从一堆石子中拿走任意数量的石子。
两个人轮流拿,谁不能拿谁赢。
上面的必胜和必败都是基于“无法操作者败”这个规则来解释的。
若某组合游戏的胜利条件是“无法操作者胜”的话,必胜态必须满足二者之一:
SG异或和>0且石子数>1的堆数>0
SG异或和=0且石子数>1的堆数=0
证明。。。
Nim-K 游戏
有 N 堆石子,每次可从 K 堆石子中拿走任意数量的石子。
两个人轮流拿,谁不能拿谁输。
证明:
数学归纳法
1.没有石子的时候,一定全部为0
2.如果当前全部为0,最多某一位1的个数变化k个,一定不会全部为0
3.如果当前不全为0,从高位开始往低位找,
如果某一位1的个数为b,之前已经动过的堆数为c,先用c个动过的堆来调整,让b变成0或者k+1,不够用,就从剩下的b的堆把1删去(大概就是先都往0凑,加上新选择的堆还不行的话,那么一定可以直接凑出k+1,直接用c个原来的堆往k+1凑)
删去1的堆一定已经取走,所以后面就可以随便0->1或者1->0了,加入那c个。如果能操作k个,那么一定可以随心所欲了。
证毕。
小例题:
两人之间的距离就是石子数量。都撞上了以后,谁撤,对面立刻怼上去。