欢迎访问
本博客源自学长前辈的教解,并参考网络资源。如有侵权请联系[email protected],如有错误劳驾指出。问题精深仅一知半解望海涵。
经典博弈论
巴什博弈(Bash Game)、尼姆博奕(Nim Game)、威佐夫博奕(Wythoff Game)
定义P-position和N-position,其中P代表Previous,N代表Next。
直观的说,上一次move的人有必胜策略的局面是P-position,也就是“后手可保证必胜”或者“先手必败”
现在轮到move的人有必胜策略的局面是N-position,也就是“先手可保证必胜”。
更严谨的定义是:
1.无法进行任何移动的局面(也就是terminal position)是P-position;
2.可以移动到P-position的局面是N-position;
3.所有移动都导致N-position的局面是P-position;我们在下文中称之为必胜点和必败点。
1、巴什博弈(Bash Game)
问题模型:
只有一堆n个物品,
两个人轮流从这堆物品中取物,
规定每次至少取一个,最多取m个,最后取光者得胜。
分析:
1、当n<=m时
,一次就可以取光,是先手必胜
。
2、当n>=m+1
时,由于,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,先手必败
3、当n>=m+2&&n<=m+m
时,先手可以取1~(m-1)
个,使得后手必败 (后手面对m+1
局面)。此时先手必胜
由上可知,面对
m+1
局面时必输,所以当前的最优策略是使得自己的后手面临m+1
局面,推广得:
4、当局势是n%(m+1)==0
时,其面临的是必败的局势。(由2 推得)
5、当n==k*(m+1)+s,(k为任意自然数,r≤m)
时,先手拿走s个物品,假设后手拿走x(≤m)个,那么先取者再拿走m+1-x个,后手依然会面对(m+1)(r-1)
个,维持局面则先手必胜
。
···· 同理当s=0,后手总是使先手面对(m+1)(r-1)
局面, 结果是先手必败
。
2、尼姆博奕(Nim Game)
3、威佐夫博奕(Wythoff Game)
初见
Problem H: 宝藏之争
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 134 Solved: 33
###Description
Xiao Ren和Lao Wang在一个棋盘式的迷宫里坐标为(a,b)位置发现了一笔宝藏,向上为a正方向,向右为b正方向。两个人都想独吞财富,本着正人君子的原则,他们决定公平竞争,游戏规则是这样的:Xiao Ren和Lao Wang两人轮流移到宝藏,谁先把宝藏移到出口位置,宝藏就归谁所有。迷宫的出口位置为左下角(0,0),每次移到可以往左方向,下方向,左下方向三个方向移到,每个人每次只能选择一个方向,但是移动的步数没有限制,Xiao Ren最先开始移到。问谁可以得到宝藏
###Input
输入两个整数a,b表示宝藏起始的位置(0<=a<=10000,0<=b<=10000)
###Output
谁获得宝藏,Xiao Ren得到宝藏输出"Xiao Ren",Lao Wang获得宝藏输出"Lao Wang"
###Sample Input
1 2
3 5
1 1
3 2
###Sample Output
Lao Wang
Lao Wang
Xiao Ren
Xiao Ren一看就知道这是个博弈1:回合制,足够聪明,求胜负。但是相较普通的博弈有一些提升:有三个移动的方向,而且移动的步数是若干步,在‘学姐’的启发下了解到SG函数可以有效解决博弈问题, 很多都是以取石子为例1。
所以感觉这个题也可以抽象为石子游戏:三堆石子(代表三个方向),可以从任意一堆 取若干石子 或者 同时从两堆取相同数量的石子 。于是这个题就成了经典的威佐夫博奕(Wythoff Game);
AC
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
while(~scanf("%d%d",&n,&m))
{
int a=min(n,m);
int b=max(n,m);
double k=(double)b-a;
int kk=(int)(k*(1+sqrt(5))/2);
if(kk==a)
printf("Lao Wang\n");
else
printf("Xiao Ren\n");
}
return 0;
}
HDU1527,和本题目都是典型的威佐夫博弈,,以本题为例:
可以看做是两堆石子
方向 石子堆 向下 移动n格 则看做 从a堆取n个石子 :向左 移动n格 则看做 从b堆取n个石子 向左下 移动n格 则看做 从a和b都取n个石子 小任赢 为 N ,老王赢为P
以p为中心 p的←→↑↓↙↗ 的延伸线上全是N
p的分布 是 以 x=y 呈 轴对称的, 即(1,2)是P 则(2,1)也是P ,所以先找x<y那一部分的规律:
a[],b[] 表示 横纵坐标
这是 一部分的 p点坐标(0,0,)、(1,2)、(3,5)、(4,7)、(6,10)······起始值a[0]=b[0]=0;k=0;性质:
1.任何自然数都包含在一个且仅有一个的奇异局势中。
证明:若(a[k],b[k])为一个奇异局势,因为b[k]=a[k]+k,a[k]>a[k-1] =》 b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].
2.任何操作都会将奇异局势变成非奇异局势
由性质1可知,即使是同时减少,两个数的差值不变,所以不可能成为其他奇异局势的差,因此也是非奇异局势;
3.可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;
、
、
、
详解看这里的