取石子游戏类分析的分析讨论
MisèreNim
基本规则同Nim Game问题,胜负判定是谁 不能继续取石子,谁就赢了。
分析
1)所有石子堆的数目都为1:
显然,若有偶数堆石子堆,则必胜,否则必败。 2)如果恰好只有一堆石子数目大于1。 我们可以把这堆石子取完或者取得只剩下1,使得 1 只剩下奇数堆数目为1的石子留给对方,由1),必 胜。 3)如果有至少2堆石子的数目大于1。 考虑⊕值: 若⊕值不为0,则按照NimGame走法取石。这样, 当对手某次取完石子后,肯定会出现2)的情况, 则必胜。
方法1
动态规划: 设f(a , b)表示两堆分别剩a颗和b颗石子时的 胜负状态。则, f(a ,b) = f(a-k ,b) or f(a ,b-k) or f(a-k ,b-k) 时间复杂度达到了o(n3)
改进
因为,
f(a , a),先手必胜 f(a , b)= f(b , a) 当f(a , b)为必败态时,对于所有c≠b, f(a ,c)必胜。
分析
n不被21整除 :使用同样策略,必胜。 n被21整除:
n=21,必败。 存在某个k,使得k + ak不被21整除 :
第一步拿掉k个,然后对方会拿掉ak个,剩下n-k-ak 个 ,到达n不被21整除的状态,因此必胜。
其它情况,必败。
Wythoff Game
问题描述: 问题描述: 有两堆各若干个石子,两个人轮流从某一 堆或同时从两堆中取同样多的石子,规定 每次至少取一个,多者不限,最后取光者 得胜。
n = 4, {1,1,2,2} 第一步若拿掉一堆为2的石堆,则只剩一堆>1 的石堆。必败。 若拿掉一堆为1的石堆,对方也拿掉一堆为1的 石堆,无论我们接下来怎么取,都只剩一堆>1 >1 的石堆。必败。 在一堆为2的石堆中拿掉一颗石子,只剩一堆 >1的石堆。必败。 n = 4,{1,1,2,3} 我们可以在3的石堆中拿掉一颗石子,变为一 个xor值为0的必败状态,所以必胜。
分析
首先得到2个初始的必败态,即 (0,fright[l+1][r])和(fleft[l][r-1], 0),同时必败态 应满足以下条件: 每行有且仅有一个必败态。 每列有且仅有一个必败态。 这是因为如果(p,x),(p,y)都是必败态,不 妨设x<=y,那么(p,y)可以转移到(p,x)去, 矛盾。
SGU429
有n堆石子,将这n堆石子摆成一排。游戏 由两个人进行,两人轮流操作,每次操作 者都可以从最左或最右的一堆中取出若干 颗石子,可以将那一堆全部取掉,但不能 不取,不能操作的人就输了。 问:对于任意给出一个初始一个局面,是 否存在先手必胜策略。
分析
设fleft[l][r]表示对于Al,…Ar当Al取多少时(其 余的A值不变),这个状态是必败的。同理 可设fright[l][r]。 只考虑(Al,Ar)的组合,我们说(X,Y)是个必败 态当且仅当X,Al+1,..,Ar-1,Y是一个先手必败 的状态 。
Hale Waihona Puke 分析A先手,双方都希望投正面,A,B得到石子 的概率分别是: PR1 = p/(1-(1-p)(1-q)); (等比求和) PR2 = (1-p)q/(1-(1-p)(1-q)) B先手,双方都希望投正面,A,B得到石子 的概率分别是: PR3 =(1-q)p/ (1-(1-p)(1-q)) PR4 = q/(1-(1-p)(1-q));
证明
若当P1=P2=….=Pn=0时,S=0,满足终状态是P局 面。 若S=0,即P1 XOR … XOR Pn=0,若取堆i中的石子, Pi->Pi’, S->S’,Pi>Pi’,则Pi XOR Pi’<>0。所以S’ XOR Pi XOR Pi’=S=0,即S’=Pi XOR Pi’<>0。满足P 局面的所有子局面都是N局面。 若S<>0,设S的二进制位是A1…An,考虑第一位 是1的。在P中取出该位同是1的,不妨设为P1。 可知P1 XOR S<P1,令P1’=P1 XOR S。可知P1’ XOR P2’ XOR … XOR Pn=0。即N局面存在至少一个 子局面是P局面。
结论
设第i个必败态为(xi , yi),有,
xi = i
yi = i
5 + 1 2
5 + 3 2
思考题
有三堆石子,分别为a, b, c颗。有两个人在做如下 游戏:游戏者任意拿走其中一堆石子,再在剩下 的两堆里任取一堆任意分成两堆(每堆至少1颗)。 两人轮流如此,谁无法这样做就算输了。 输入格式: 有n组数据:每一行三个数a, b, c,满足 1≤a,b,c≤1,000,000,000。 输出格式: 对应n行:“1”——先手赢;“0”——后手赢。
同理可确定fright[i][j]。
实例
fright[l+1][r]=8,fleft[l][r-1]=6。 失败状态为: (0,8),(6,0),(1,1),(2,2),..,(7,6),(8,7),(9,9),(10,1 0)。
SPOJ4060
有n个石子放成一堆。A和B轮流操作,A先 手。操作为投掷一枚硬币,如果正面朝上、 则从石子堆中取出一枚石子。A有P的概率 投出他想投的面,B有Q的概率投出他想投 的面。(P,Q≥0.5)问A赢的期望。
证明
按照NimGame法则取完石子后,必定会给 对手留下⊕值为0的局面。因此不可能给对 手留下2)的局面(容易证明,2)局面的 ⊕值肯定不为0),而对手一次最多将一堆 石子数大于1的石子堆处理掉。因此2)的 情况肯定会出现。 相反,若⊕值为0,则无论如何走都会给对 方留下2)或3)的情况,必败。
实例
计算
设L=fleft[i][j-1],R=fright[i][j-1],x=Aj,则fleft [i][j]由以下方式确定:不妨设L≥R,
当x<R时,fleft[i][j]=x; 当x=R时,fleft[i][j]=0; 当R<x≤L时,fleft[i][j]=x-1; 当x>L时,fleft[i][j]=x。
那么f(a,b,c)=1否则f(a,b,c)=0。
小规模情况
f(a, b, c)必败点如下:
f(1,1,1),f(1,1,3),f(1,3,1),f(1,3,3); f(2,2,2); f(3,1,1),f(3,1,3),f(3,3,1),f(3,3,3); f(4,4,4); f(5,1,1),f(5,1,3),f(5,3,1),f(5,3,3); f(6,2,2); f(7,1,1),f(7,1,3),f(7,3,1),f(7,3,3);
推广到k>1
K=2 3—————— 1 1 5—————— 1 0 1 10—————— 1 0 1 0 15————— 1 1 1 1 2 2 0 0 (mod 3) 所以这是N局面,第一步取10->6 15->7可以到达一个P局面3 5 6 7。 3—————— 1 1 5—————— 1 0 1 6 —————— 0 1 1 0 7 ————— 0 1 1 1 0 0 0 0 (mod 3)
“取石子游戏问题”的几种变形 及其解法探讨
长沙市雅礼中学 朱全民
Bash Game
问题描述: 问题描述: 只有一堆n个石子,两个人轮流取石子,规 定每次至少取1个,最多取m个。最后取光 者得胜。
分析
1.n = m+1时,先手显然必败。 2.n = (m+1)x+y时,先手先取y个,若对手取 k个则先手再拿走m+1-k个。 3.总能保证n能被(m+1)整除,所以最终先手 必胜。当y为0时,后手必胜。
找出规律
a=1,3,5,7,(b ,c)=(1,1),(1,3),(3,1),(3,3),…, a=2,6,(b ,c)=(2,2),…, a=4,(b ,c)=(4,4),…, 分析a的特点 :
1)a=1,3,5,7都是奇数,b 2)a=2,6是偶数,它只含1个2 3)a=4是偶数,但它含2个2
实例
n = 7,m = 3 (x,y)表示当前石子数和下次拿走的石子数。 (7,3)->(4,y)->(4-y,4-y):先手获胜。 n = 8, m = 3 第一步无论先手去什么,后手总可以将石 子数变为4,无论先手再下步取什么,后手 总能将剩下的石子一次取完。
问题变形
(SLPC2009) 只有一堆n个石子,两人轮流取石子,规定 每次取1到20个。后手的策略是:如果当前 石子数小于等于20个则全部拿走,否则若 先手取了k个,则后手取ak个。最后取光者 得胜。先手是否有必胜策略?
分析
那么是不是m+1就是必败的呢,事实上我 们也可以选择不直接跳到p[i-1]去,这时问 题转化成了一个(x-p[i-1])的子问题,即看谁 会被迫先走到p[i-1]的绝对必败态去 。 接下来的第一个必败态是p[i-1]+p[j],其中 p[i-1] + p[j]<=m。
实例
当k=10时,假设当前已经求出的必败态集合是 {2 3 4 5 6 7 8 9 10 11 13 15 17 19 21 24 27 30 33 37 41 46 51 57 63 70 77 85 94 104 115 }。 我们要求后一个必败态,m = (115 / 10) = 11 , p[j] = 13 , p[j - 1] = 11; 显然从116-126都是必胜的,他们可以转化到115这 个必败态,那127呢?我们可以取1个石子,转移到 126,显然这时126无法取到足够多的石子转移到 115,它成为必败态,于是127也是必胜态。而128 = 115 + 13 则成为了必败态,因为无论是转移到127 还是126它都使下一个状态必胜,这里的p[j] = 13 , p[i-1] = 115 ,所以 p[i] =128。