博弈论(威佐夫博奕、尼姆博弈、巴什博弈)

来源:互联网 发布:强制刷机软件 编辑:程序博客网 时间:2024/04/27 19:16

//威佐夫博奕、尼姆博弈、巴什博弈。
⑴HDU-1846(中文)Brave Game
有一堆石子一共有n个;两人轮流进行;每走一步可以取走1…m个石子;最先取光石子的一方为胜;

C(C<=100) ;n和m(1<=n,m<=1000)

问题类型:巴什博弈
只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取1个,最多取m个,最后取光者得胜。
显然,如果n = m + 1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:
如果 n = (m + 1) * r + s ,(r为任意自然数,s≤m),即n%(m+1) != 0,则先取者肯定获胜。
巴什博弈还是很好理解的,以你是先手的角度考虑。你想把对手给弄垮,那么每一局,你都必须构建一个局势,这个局势就是每次都留给对手m+1的倍数个物品。因为,如果n=(m+1)r + s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

//SG(x)=x%(m+1).判断初始状态SG值是否为0,是则为P-position,先手必败。

⑵POJ-2234 Matches Game
有n堆石子,每人每次可以从一堆中拿走任意多个,两人轮流操作,谁无子可取谁输。输入n堆石子各自的数量,输出先手是否能赢。

n<=20;a[i]<= 10,000,000;

问题类型:尼姆博奕
NP问题,必胜态N(next player wins),必败态P(previous player wins)
如果某状态的直接后继中有必败态那么它一定是必胜态,否则为必败态。
SG函数。设函数sg(x)。我们先把所有的最终局面(最终局面均为必败P局面)sg(x)赋值为0。然后所有其他局面sg(x)等于其直接后继状态中没有出现过的最小自然数。这样一来所有是sg(x)=0的状态就是必败态,其他为必胜态。
根据定理:有这样一个游戏,是多个游戏共同进行,每个游戏都执行到底时才算整个游戏结束,每次一个选手可以把一个游戏进行一步。对于这样的游戏它的某状态的sg(x)值,为每个子游戏的现在所处的状态的sg(x)值抑或起来的结果。
所以对于本题,我们只需要研究一堆石子的sg(x)的规律即可得出若干堆石子共同进行的胜败。
对于一个有n个石子的堆,其开始状态(有n个石子,没有被取过)g(x)=n;

把每堆数量求异或a1^a2^…^ai’^…^an,结果为零则先手必输,否则必赢

⑶POJ-1067取石子(中文)
有两堆石子,给定两堆石子的数量,可以进行如下两种操作:
1、从某一堆中拿走一定数量的石子
2、从两堆石子中拿走相同数量的石子
两个人轮流拿,假设都按照最优策略来操作,谁输呢?

多组n<= 1,000,000,000;

问题类型:威佐夫博弈
分析:当某一个人面对(0,0)的局势时,必败,我们把面临该局势必败的局势称为必败局势。易知上一个必败局势为(1,2),因为不管面临该局势的人采用何种操作,下一个人都可以使之面临(0,0)的趋势,则接下去的必败局势分别为(3,5),(4,7),(5,9)……
设第k+1个必败局势为(ak,bk),ak<=bk,有如下性质:
ak=(sqrt(5)+1)*k/2;bk=ak+k;
我们称不满足该条件的局势称为必胜局势,因为总可以进行一次操作使得下一个人面临必败局势。
下面我们要做的工作就是判断该局势(a,b)是不是必败局势。
我们首先要估算k;假设k是必败局势,k=(sqrt(5)-1)*a/2;
对k取整,如果a=(sqrt(5)+1)*k/2不成立,我们可以对k进行修正:k++;

此时, 若b=a+k则该局势为必败局势。

⑷POJ-2484 A Funny Game

摆一圈硬币,两人轮流取,每次取一个或者位置相邻的两个(最开始就要相邻,因为中间硬币被取走而相邻的不算)。谁无币可取谁输。问谁赢。

对于许多硬币的情况,先手必然把这堆硬币由一个环拆开一个缺口变为了一条线,后手的任务是将一条线拆成一样长得两条线(必定能实现),然后跟着先手在两条线之间做对称的动作即可。

⑸POJ-2975 Nim
有 N 堆石子,两人轮流从任一堆中取任意个石子(至少一个),最后一个取石子的人为胜利者。题目有讲解如何判断当前形势是否为必胜态:
把每堆石子数目化为二进制,然后进行按位异或,若最后的结果为 0,则为必败态。

最后是求有多少种赢法。

首先求各堆石子数异或后的结果 t 。若 t = 0,则为必败态。否则,我们可以使它变成必败态然后让对手决策。由于双方都是最优决策,所以第一步决定后,以后的决策也就定了。所以又多少种赢法取决于第一步可以创造出多少种必败态。

设第 i 堆石子的数目为 a[i],若 t XOR a[i] < a[i] ,则我们可以在该堆石子中取 t XOR a[i] 颗石子,使局面变成必败态。因此,我们要做的,就是统计有多少堆石子的数目大于 t XOR a[i] 。

⑹POJ-2068 Nim

给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略。

博弈DP

⑺POJ-2348 Euclid’s Game

给两堆石子(题目中是数,配合一下上文这里说石子),两人依次取石子,规则是:每次从石子数较多的那堆取(两堆石子数目相等时任选一堆),取的数目只能为石子少的那一堆的正整数倍。最后取完一堆石子者胜。问给定情况下先手胜负情况。

现有状态(x,y) (设x>0且y>0,其它情况自行考虑),

当x=y时,显然先手胜,不妨设x

堆石子,两人轮流操作,每次操作只能选定其中一堆,并取走若干个(>=1个)。谁取走最后一个谁输。给定一个状态,问先取的赢还是后取的赢。

问题类型:尼姆博奕
所以想到sg函数,nim的sg是把格堆石子数抑或起来,看是否为0。本题我们就自己写出一些能解决的状态(可以手动判断np状态),观察各堆总数抑或结果和必胜必败态的联系。发现一个规律,sg函数为0则必胜,否则必败。只有一种特殊情况不符合该规律,就是所有堆都为1。
在网上看到了一篇证明,在此复制过来,简单加工一下。
不管全0的最后必胜态(好像没影响)
于是规定的必胜态为:
1.所有的都是1,异或结果为0(1状态)
2.有大于1的,异或结果不为0(2状态)
必败态为:
1.所有的都是1,异或结果不为0(3状态)
2.有大于1的,异或结果为0(4状态)
根据定义,证明一种判断position的性质的方法的正确性,只需证明三个命题:
1、这个判断将所有terminal position判为P-position;
2、根据这个判断被判为N-position的局面一定可以移动到某个P-position;
3、根据这个判断被判为P-position的局面无法移动到某个P-position。 (有点归纳的意思)
最终必败态为只有1个,就是只有1个石子,符合。
对状态1和3,显然成立
状态之间的主要转化在于: 1状态和3状态相互转化。 2状态和4状态相互转化。
对于2状态:
假设异或结果为x。
当x=1时,肯定是最低位为1的堆有奇数个,只要在这些最低位为1的堆中选择一个取走1个石子,就可将最低位为1的堆数变为偶数,抑或结果变为0。其中一个最低位1的操作,并不会让任何一个大于1的堆消失。因此不会导致状态1。抑或结果为0,不会导致状态3,而会变为状态4。
当x>1时:
{
x与一个在x最高位是1且其余位均为0的数(设导致最高位为1的堆为a)异或后结果设为y,即y是将x的最高位由1改为0后得到的数字。
y=0时
{
其它的堆全为1个石子时,将a堆减为1,满足3状态。
如果其它堆中有大于石子数1的,将a堆取走若干,使得的a堆最高位变为0其他位不变,就满足4状态了。
}
y=1时
{
其它的堆全为1个石子时,将a堆取走若干,使得的a堆最高位变为0其他位不变,满足3状态。
如果其它堆中有石子数大于1的,将a堆取走若干,使得的a堆最高位变为0并使得最低位为1,其他位不变,就满足4状态了
}
y>1时,就将a堆的最高位减少使得其余位恰好与y相同(这是可以做到的,因为a堆最高位为1的数,大于y),使得抑或结果为0,满足4状态。
}
对于4状态,它不能变为另一个异或结果为0的(不能变为4状态)。而且异或结果为0就不可能只有一个大于1的堆,所以也不能变为3状态.所以只能变为必胜态。
所以它也满足。
综上,所以这个条件是符合的

0 0
原创粉丝点击