• 4.1.5 Georigia and Bob


    Problem description:

      Georgia and Bob 在玩一个游戏。

      

      如图所示,排成直线的格子上放有n个棋子。棋子 i 在左数第 Pi 个格子上。Georgia 和 Bob 轮流选择一个棋子向左移动。每次可以移动一格及以上任意多格,但是不允许反超其他的棋子,也不允许将两个棋子放在同一格子内。无法进行移动操作的一方失败,假设Georgia 先移动,当双方都采取最优策略时,谁会获胜?

      1<=n<=1000

      1<=Pi<=10000

    Input:

      n = 3;

      p = { 1, 2 , 3}

    Output:

      Bob wins

    思路:将其看成一种Nim游戏。

    如果将棋子两两成对当作整体考虑,我们就可以把这个游戏转化为 Nim 游戏,先按棋子个数的奇偶分情况讨论。

    当棋子个数为偶数时,把棋子从前往后两两组成一队,那么,我们就可以将每队棋子看成 Nim 中的一堆石子。石子堆中石子的个数等于两个棋子之间的间隔。

    为什么可以这样转化,考虑其中的某一对棋子,将右边的棋子向左移动就相当于从 Nim 的石子堆中取走石子。

    另一方面,将左边的棋子向左移动,石子的数量就增加了。这就与 Nim 不同了。但是,即使对手增加了石子的数量,只要将所加部分减回去就回到了原来的状态;即便自己增加了石子的数量,只要对手将所加的部分减回去也回到了原来的状态。因此,该游戏的胜负状态和所转移成的 Nim 的胜负状态是一致的。

     

    当棋子的个数为奇数时,对最左边的棋子按下图进行特殊处理后,同样可以转成 Nim 。

    Code:

      

    int MAX_N = 1000;
    int N, P[MAX_N];
    void solve(){
        if(N%2==1) p[N++]=0;
        sort(P,P+N);
        int x=0;
        for(int i=0;i+1<N;i+=2)
            x^=(P[i+1]-P[i]-1);
        if(x==0) puts("Bob wins");
        else puts("Georgia wins"); 
    }
  • 相关阅读:
    [极客大挑战 2019]EasySQL CTF复现
    [极客大挑战 2019]Havefun (一起来撸猫) CTF复现
    一个简单漂亮的登录页面(前端)
    Python XPath的使用
    Python Requests的基本用法
    Linux配置jdk环境变量
    高性能 Java RPC 框架 Dubbo
    Zookeeper的配置文件及命令
    zookeeper怎么实现分布式锁
    Zookeeper-集群崩溃恢复
  • 原文地址:https://www.cnblogs.com/astonc/p/9950035.html
Copyright © 2020-2023  润新知