【ACM摸鱼】宝藏之争 --经典博弈(威佐夫) -- 找规律

欢迎访问

本博客源自学长前辈的教解,并参考网络资源。如有侵权请联系[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;

扫描二维码关注公众号,回复: 3365192 查看本文章

性质:
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.可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;



详解看这里的


  1. 以石子为例的 NIM游戏 :有若干堆石子,每堆石子的数量ai都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。 ↩︎ ↩︎

猜你喜欢

转载自blog.csdn.net/schiwon/article/details/80922272
今日推荐