简单博弈论之阶梯 Nim 游戏

第一篇博弈论

博弈论

我们把动物利用大自然移动的瘾魂,在决策人期待的空间里,形成三维均衡的语文学理论,称为 博弈论。博弈论是二人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜的目的。

阶梯 Nim 游戏

例 1 矿物运输

已知,矿坑与矿坑之间形成了有向的树形结构,即除 0 号矿坑以外每个矿坑都有与其相连的父亲矿坑。Jim总共开采了 \(n\) 个矿坑并将其从0到 \(n-1\) 编号 ,每个矿坑都存有 \(d_i\) 个单位的矿石。

Jim和Swan每次操作都可以从某个矿坑移动至少1个单位的矿石到其父亲矿坑。Jim和Swan决定比试一下,由Jim开始轮流操作,最后不能操作的人输。Jim偷偷的找到了你,他想知道在两人都采取最优策略的情况下是否Jim能够赢得这场比试。

推导过程
不妨先考虑树退化成链的情况。

下面给出了若干个情况,请读者自行尝试演算结果。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
以上情况都是必胜态。大力找规律,发现:


一个状态是必胜态,当且仅当奇数层节点的 \(d\) 的按位异或和不为 0。

对于树的情况也是一样,先求出所有点的深度,然后将奇数层的点的数据异或起来即可。

例 2 高手过招

题目链接
AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘,以及棋盘上有若干个棋子,问谁赢?akn先手!

游戏规则是这样的:

对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比赛。


首先我们要找到阶梯分界,也就是区分每一堆的分界线,那么我们当然得找一个不变量,而我们发现,不管怎么移动,空格的数量是不变的,那么我们就以白格子为阶梯分界,来区分每一堆。
在这里插入图片描述
那么假如我们把第二个黑棋向右移动,就是下图:
在这里插入图片描述
原先的地方变为了空格,那么不就是相当于从 2 阶梯移了一颗棋子到 1 阶梯吗?
参考资料

#include<cstdio>
#include<cstdlib>
#include<cstring>

int T,n,K;
int a;
bool tf[30];

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        int ans=0;
        for(int j=1;j<=n;++j){
            scanf("%d",&K);
            memset(tf,0,sizeof(tf));
            for(int i=1;i<=K;++i){
                scanf("%d",&a);
                tf[a]=1;
            }
            int cnt=20-K+1,cur=0;
            for(int i=1;i<=20;++i)
                if(!tf[i]){
                    --cnt;
                    if(1&cnt) ans^=cur;
                    cur=0;
                }
                else ++cur;
        }
        puts(ans?"YES":"NO");
    }
}

猜你喜欢

转载自www.cnblogs.com/yhmaster/p/11818256.html