数学基础:博弈论问题
简单情况下可以手摸规律,找到规律后一般可以O(1)解决问题。例题:洛谷P4018、P4860。或者找出一定规律后进行递推,并不是非要找出规律的表达式。
但是有的问题的规律比较复杂,涉及到数学推导过程......在此对见到的复杂博弈论问题进行整理
(1)nim游戏
基本模型:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。
令ai表示第i个石子堆内石子的个数。(a1,a2,...,aN)为奇异局势当且仅当a1⊕a2⊕...⊕aN=0。
- a1⊕a2⊕...⊕aN=k=0,一定存在一步特定移动使得a1⊕a2⊕...⊕aN=0;
- a1⊕a2⊕...⊕ai...⊕aN=0,不存在一步合法移动使得a1⊕a2⊕...⊕ai′...⊕aN再次为0,
- 当a1⊕a2⊕...⊕ai...⊕aN=0时,下一步必然为a1⊕a2⊕...⊕ai′...⊕aN!=0
因此,谁面对奇异局势,谁就是必输的。至于说怎么从非奇异局势一步转化为奇异局势:
for(int i=1;i<=n;i++){ if(k^a[i]<a[i]){ printf("%d %d\n",i,a[i]-(k^a[i])); //输出在哪个位置上减多少 a[i]=k^a[i]; break; } }
参考链接:https://www.luogu.com.cn/problem/solution/P1247
nim游戏还有一些变种:阶梯nim,共n阶楼梯,每阶楼梯上若干颗棋子,操作者轮流将某级楼梯上的若干颗棋子下移,只需考虑奇数阶梯上棋子数求nim和进行判断;n个格子排成一排,操作者每次可将一颗棋子向前移动,把每颗棋子到0号格的距离视为一堆棋子进行nim游戏;一个矩阵棋盘,操作者每次分别在某一行操作一个黑白棋子对向移动,将每行黑白棋子的距离视为一堆棋子进行nim游戏;
(2)威佐夫博弈
有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。(看起来是比nim多了一种选择)
结论:若两堆物品的初始值为(x,y),且x<y,则另z=y-x;记w=(int)[((sqrt(5)+1)/2)*z ];若w=x,则先手必败,否则先手必胜。
(3)斐波那契博弈
有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。
结论:先手胜当且仅当n不是斐波那契数(n为物品总数)


浙公网安备 33010602011771号