以下部分内容参考百度百科
(一)巴什博奕(Bash Game):
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
分析:
假如m=3。(F记为必败点,W记为必胜点)
用0-n的数字来标记物品
物品 0 1 2 3 4 5 6 7 8 9 ...n
胜负 F W W W F W W W F W ....
取0代表没有物品可以取了,输
在1 2 3节点取物品时候分别可以取1 2 3个物品就取完了,赢
综上可知:你只要保证取完物品之后下一人面对F点,那么这个人一定输,你就一定赢。
(如:在节点6,取2个物品,那么下一个人在节点4开始取,而节点4是必输点,所以6是必赢点。再如节点8,不管如何取,下一个人都在5 6 7这3个必胜节点开始取,所以8是必输点。)
从此可以推出4 5 6 7 8 9…. 之后节点的胜负情况,从中找出规律。
HDU相关题型1846 2147 1536 1848
(二)威佐夫博奕(Wythoff Game):
有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
我们用(ak,bk)(ak ≤ bk,k=0,1,2,…)表示两堆物品的数量并称其为局势,如果甲面对(0,0)那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。
可以看出,a0=b0=0,ak是前面未出现过的最小自然数,而 bk= ak + k。
以下内容转自:
http://www.cppblog.com/longshen/archive/2013/03/14/83020.html#Post
(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示奇异局势
求法:
ak =[k(1+√5)/2], bk= ak + k (k=0,1,2,…,n 方括号表示取整函数)
判断:
Gold=(1+sqrt(5.0))/2.0;
1)假设(a,b)为第k种奇异局势(k=0,1,2…) 那么k=b-a;
2)判断其a==(int)(k*Gold),相等则为奇异局势
(注:采用适当的方法,可以将非奇异局势变为奇异局势.
假设面对的局势是(a,b)
若 b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0);
1. 如果a = ak,
1.1 b > bk, 那么,取走b - bk个物体,即变为奇异局势(ak, bk);
1.2 b < bk 则同时从两堆中拿走 ak – a[b – ak]个物体,变为奇异局势( a[b – ak] , a[b – ak]+ b - ak);
2 如果a = bk ,
2.1 b > ak ,则从第二堆中拿走多余的数量b – ak
2.2 b < ak ,则 若b = aj (j < k) 从第一堆中拿走多余的数量a– bj; (a > bj)
若b = bj (j < k) 从第一堆中拿走多余的数量a– aj; ( a > aj)
)
相关题型:POJ 1067 HDU1527 HDU 2177
(三)尼姆博奕(Nimm Game):
有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜.
这种情况与二进制有密切关系。 计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示。
任何奇异局势(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)即可。
相关题型:HDU 1850 HDU 1944
pku 2234 hdu 1730 pku 1740 pku 1704 pku 1082