取石子游戏类分析的分析讨论

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算
设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。
SGU429
有n堆石子,将这n堆石子摆成一排。游戏 由两个人进行,两人轮流操作,每次操作 者都可以从最左或最右的一堆中取出若干 颗石子,可以将那一堆全部取掉,但不能 不取,不能操作的人就输了。 问:对于任意给出一个初始一个局面,是 否存在先手必胜策略。
分析
设fleft[l][r]表示对于Al,…Ar当Al取多少时(其 余的A值不变),这个状态是必败的。同理 可设fright[l][r]。 只考虑(Al,Ar)的组合,我们说(X,Y)是个必败 态当且仅当X,Al+1,..,Ar-1,Y是一个先手必败 的状态 。
结论
设第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”——后手赢。
证明
若当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局面。
方法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)必胜。
证明
按照NimGame法则取完石子后,必定会给 对手留下⊕值为0的局面。因此不可能给对 手留下2)的局面(容易证明,2)局面的 ⊕值肯定不为0),而对手一次最多将一堆 石子数大于1的石子堆处理掉。因此2)的 情况肯定会出现。 相反,若⊕值为0,则无论如何走都会给对 方留下2)或3)的情况,必败。
实例
同理可确定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赢的期望。
推广到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)
因此,
对于n,所有状态中必败的状态是o(n)级别的,我 们可以不断寻找必败态,利用这些状态更新其它 状态。复杂度为o(n2)。
小规模情况
如果甲面对(0,0),那么甲已经输了,这 种局势我们 称为必败态。前几个必败态是: (0,0) (1,2) (3,5) (4,7) (6,10) (8,13) (9,15) (11,18) (12,20) 1=2-1, 2=5–3, 3=7–4, 4=10–6, 5=13–8, 6=15-9,7=18-11, 8=20-12,……,
递推
设f(a,b,c)表示状态(a,b,c)的胜负: f(a,b,c)=1为胜局,表示先手胜,f(a,b,c)=0 为败局。 f(a,b,c)可以递推计算:
若存在1≤k≤a-1使得f(k,a-k,b)=0或f(k,a-k,c)=0 或存在1≤k≤b-1使得f(k,b-k,a)=0或f(k,b-k,c)=0 或存在1≤k≤c-1使得f(k,c-k,a)=0或f(k,c-k,b)=0
分析
那么是不是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。
“取石子游戏问题”的几种变形 及其解法探讨
长沙市雅礼中学 朱全民
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时,后手必胜。
实例
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个。最后取光者 得胜。先手是否有必胜策略?
分析
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));
分析b,c的特点 : b ,c特点直接与a的特点相关。
Nimk游戏
问题描述: 问题描述: 两人轮流对N堆石子进行操作,每堆分别有 Pi颗。每人每次可以从最多K堆中取走任意 多颗石子,但至少要取走一颗石子。谁取 到最后一颗谁胜利。什么情况下先手必胜, 什么情况下后手必胜
预备知识
定义:如果一个局面先手必胜,就称之为N局 面,反之称之为P局面。Nimk问题当K=1时就 是经典的Nim问题。 XOR运算为对二进制进行逐位不进位加法(对 每一位结果mod 2)。 Nim问题的解法是:对于一个局面,令S=P1 XOR P2 XOR P3 XOR … XOR Pn。若S=0则为P局 面,否则为N局面。
找出规律
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
MisèreNim
基本规则同Nim Game问题,胜负判定是谁 不能继续取石子,谁就赢了。
分析
1)所有石子堆的数目都为1:
显然,若有偶数堆石子堆,则必胜,否则必败。 2)如果恰好只有一堆石子数目大于1。 我们可以把这堆石子取完或者取得只剩下1,使得 1 只剩下奇数堆数目为1的石子留给对方,由1),必 胜。 3)如果有至少2堆石子的数目大于1。 考虑⊕值: 若⊕值不为0,则按照NimGame走法取石。这样, 当对手某次取完石子后,肯定会出现2)的情况, 则必胜。
那么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);
n = 4, {1,1,2,2} 第一步若拿掉一堆为2的石堆,则只剩一堆>1 的石堆。必败。 若拿掉一堆为1的石堆,对方也拿掉一堆为1的 石堆,无论我们接下来怎么取,都只剩一堆>1 >1 的石堆。必败。 在一堆为2的石堆中拿掉一颗石子,只剩一堆 >1的石堆。必败。 n = 4,{1,1,2,3} 我们可以在3的石堆中拿掉一颗石子,变为一 个xor值为0的必败状态,所以必胜。
A stone game
一堆石子有n颗,两个人轮流从中取石子, 第一个人第一步最多取n-1颗,接下来每一 步,假设上一步取了x颗,当前取石子的人 最多可以取k*x颗,当然一个人不能一颗石 子也不取。取走最后一颗石子的人获胜。 假设两个人都使用最优策略,请问对于给 定的n,k先手能否获胜?
分析
定义x为绝对必败态,当且仅当无论何种情况 下只要走到了这个状态,那么先手必然失败的 状态。 假设前1..i-1个绝对必败态p[1]..p[i-1](p[1]=1)。 p[i-1]+1,p[i-1]+2,…,p[i-1]+m都是必胜态的充分 条件是:k*m<p[i-1]。(先手可以走到p[i-1]的 状态同时第二个人不能一次把所有石子拿走 )
分析
首先得到2个初始的必败态,即 (0,fright[l+1][r])和(fleft[l][r-1], 0),同时必败态 应满足以下条件: 每行有且仅有一个必败态。 每列有且仅有一个必败态。 这是因为如果(p,x),(p,y)都是必败态,不 妨设x<=y,那么(p,y)可以转移到(p,x)去, 矛盾。
分析
n不被21整除 :使用同样策略,必胜。 n被21整除:
n=21,必败。 存在某个k,使得k + ak不被21整除 :
第一步拿掉k个,然后对方会拿掉ak个,剩下n-k-ak 个 ,到达n不被21整除的状态,因此必胜。
其它情况,必败。
Wythoff Game
问题描述: 问题描述: 有两堆各若干个石子,两个人轮流从某一 堆或同时从两堆中取同样多的石子,规定 每次至少取一个,多者不限,最后取光者 得胜。
相关文档
最新文档