博弈
巴什博奕: 一堆有n个物品,两个人轮流从这堆物品中取物,规定每次取出物品为m(1<= m)。 最后取光者得胜。
如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
定义两个概念: 必胜点 你取这点必胜 判断是必胜点 :下一步可以走到必败点
必败点 你取这点必败 判断是必败点 :下一步可以走到的全是必胜点
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1847
http://acm.hdu.edu.cn/showproblem.php?pid=1846
Nimm Game:
问题: 有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,
分析:(网上的)我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。
计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示这种运算。这种运算和一般加法不同的一点是1+1=0。先看(1,2,3)的按位模2加的结果:
1 = 二进制 01
2 = 二进制 10
3 = 二进制 11 (+)
———————
0 = 二进制 00 (注意不进位)
对于奇异局势(0,n,n)也一样,结果也是0。任何奇异局势(a,b,c)都有a(+)b(+)c =0。
如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b< c,我们只要将 c 变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)b)=(a(+)a)(+)(b(+)b)=0()0=0。要将c 变为a(+)b,只要从 c中减去 c-(a(+)b)即可。
总结:
》最后取光为胜: 每堆个数(x1, x2, x3, …, xn) 当且仅当 x1 xor x2 xor x3 xor … xor xn = 0。 (xor 代表 异或)时, 先手者胜~~~~
》最后取光为败: 1. 每堆个数都为1 时 堆数偶数 ——先手胜, 堆数奇数——先手败
2. 每堆个数(x1, x2, x3, …, xn) 当且仅当 x1 xor x2 xor x3 xor … xor xn = 0。 (xor 代表 异或)时, 先手者败~~~~
题目链接:
SG :
问题:有N堆石子,每堆有ni个,每次可以取si(几个特定的数)个,两个人轮流取。
定义mex (minimal excludant) 运算,表示最小的不属于这个集合的非负整数。
例如: mex{0,1,2,4}=3、mex{2,3,5}=0、 mex{}=0
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数 g 如下:
对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数 g 如下:
g(x)= mex{ g(y) | y 是 x的后继 }。
SG函数的性质。首先,所有的没有出边的顶点,其SG值为0,因为它的后继集合是空集。然后对于一个 g(x) = 0的顶点x,它的所有后继 y 都满足 g(y) != 0。
SG函数的性质。首先,所有的没有出边的顶点,其SG值为0,因为它的后继集合是空集。然后对于一个 g(x) = 0的顶点x,它的所有后继 y 都满足 g(y) != 0。
对于一个 g(x) != 0 的顶点,必定存在一个后继 y 满足 g(y) = 0。
例如:取石子问题,有1堆X个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;
···
求SG值:
1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);
2.可选步数为任意步,SG(x) = x;
3.可选步数为一系列不连续的数,用GetSG()计算。
例如:取石子问题,有1堆X个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个数的SG值为多少?
sg[0]=0,f[]={1,3,4},
x=1时,可以取走1-f{1}个石子,剩余{0}个,mex{sg[0]}={0},故sg[1]=1;
x=2时,可以取走2-f{1}个石子,剩余{1}个,mex{sg[1]}={1},故sg[2]=0;
x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,mex{sg[2],sg[0]}={0,0},故sg[3]=1;
x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;
x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;
···
求SG值:
1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);
2.可选步数为任意步,SG(x) = x;
3.可选步数为一系列不连续的数,用GetSG()计算。
题目链接:
威佐夫博弈:
有两堆石子,数量为a,b,(a, b任意可以不同)。
游戏规则:
两个人轮流取石子。
》 在任意的一堆中取走任意多的石子;
》 在两堆中同时取走相同数量的石子。
最后取完的人为胜。
结论:
c = min(a, b)
d = abs(a-b)
e = (1+sqrt(5.0))/double(2.0);
if( (int)(d*e) == c ) 败
else 胜
Ferguson博弈:
进行游戏需要用到两个盒子。第一个盒子中有n枚石子,第二个盒子中有m个石子(n, m > 0)。 操作:清空一个盒子中的石子,然后从另一个盒子中拿若干石子到被清空的盒子中,使得最后两个盒子都不空。当两个盒子中都只有一枚石子时,游戏结束。最后成功执行操作的玩家获胜。
结论:(x,y)至少一偶时,先手胜;都为奇时,先手败
Chomp!:
情人节的时候,潘典安买了一块长方形的棋盘巧克力,和他最爱的女友一起吃,巧克力由n*m块格子组成。为了增加情人节的情趣,潘典安和她女友轮流选择一个格子,并把这个格子右面,上面和右上方的巧克力全部取走。取到左下角格子的玩家输,就要给对方一个热烈的吻。假设每次都是潘典安先手,他是否存在必胜策略呢?
结论: 除了1*1的棋盘,对于其他大小的棋盘,先手总能赢。
Fibonacci:
有一堆个数为 n 的石子,游戏双方轮流取石子,满足:
1. 先手不能在第一次把所有的石子取完。
2. 之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)
约定取走最后一个石子的人为赢家,求必败态。
结论:先手胜 当且仅当n不是Fibonacci数。
定理:任何正整数可以表示为若干个不连续的 Fibonacci 数之和。
1. 先手不能在第一次把所有的石子取完。
2. 之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)
约定取走最后一个石子的人为赢家,求必败态。
结论:先手胜 当且仅当n不是Fibonacci数。
定理:任何正整数可以表示为若干个不连续的 Fibonacci 数之和。

浙公网安备 33010602011771号