博弈

巴什博奕: 一堆有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 代表 异或)时,      先手者败~~~~
 
题目链接:
  http://acm.hdu.edu.cn/showproblem.php?pid=1907  // 最后取光者败
 
SG :
  问题:有N堆石子,每堆有ni个,每次可以取si(几个特定的数)个,两个人轮流取。   

  定义mex (minimal excludant) 运算,表示最小的不属于这个集合的非负整数。
    例如: mex{0,1,2,4}=3、mex{2,3,5}=0、 mex{}=0
     对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数 g 如下:
    g(x)= mex{  g(y)  |  y 是 x的后继  }。
     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()计算。
题目链接:
 
威佐夫博弈:
  
有两堆石子,数量为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 数之和。
 
 
posted @ 2015-09-22 15:52  马晨  阅读(144)  评论(0)    收藏  举报