• CCNU 2012.7.8 Problem H


    Problem H
    Description
      喵星人和汪星人玩游戏。
      这个游戏是这样的,有n个石子排成一排,其中第m个是白色的,其他都是黑色的,喵星人先走,汪星人后走,每步可以颠倒任意连续k个石头的顺序,且这k个石头中必须存在白色石头。谁先将白色石头移动到位置l谁就获胜,假设喵星人和汪星人都是选择最优的走法,问谁将获胜。
    Input
      第一行输入一个数T,表示测试数据个数,对于每组测试数据,输入四个数n,m,k,l(1<n<=10^6,1<=m,k,l<=n),数据保证刚开始时白色石头不在位置l。
    Output
      对于每组测试数据,如果喵星人获胜,输出"Miao",如果汪星人获胜,输出"Wang",如果谁也无法获胜,输出"Draw",输出时不带引号。
    Sample Input
      3
      5 1 2 2
      5 5 2 3
      3 1 1 2
    Sample Output
      Miao
      Wang
      Draw
    Hint
      第一组数据,五个石头排列为白黑黑黑黑,因此喵星人把前两个石头颠倒顺序可得黑白黑黑黑,此时白色石头位于位置2,因此喵星人获胜。
      第二组数据,五个石头排列为黑黑黑黑白,每次可以颠倒任意两个石头的顺序,但是由于这两个石头必须有白色石头存在,因此喵星人只能颠倒最后两个石头,得到黑黑黑白黑,之后由于汪星人选择的是最优走法,因此,汪星人颠倒3~4个石头得到黑黑白黑黑,此时白色石头位于第三个位置,汪星人获胜。
      第三组数据,由于只能翻一个石头,又因为一定要包含白色石头,因此每次翻完之后结果是不变的,因此谁也无法获胜,输出Draw。
    题目

    miao先走,如果存在必胜的局势,那么它现在一步就可以赢,或者说存在某种坑爹的局势(白棋在角落,由于每次移动必须操作白棋的必败局势),那么wang赢,否则的话,两个人完全可以进入死循环(一个人走,另一个人恢复)

    所以开始就要判一步能不能赢,模拟一下操作发现对于所有的当前状态m,操作数为k是奇数时,下一个状态不能是m+2*i+1,当操作数是偶数时,下一个状态不能是m+2*i,而且范围在1~n,翻转的地方处理是注意点边界范围

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    using namespace std;
    bool is_ok(int n,int m,int k,int l)
    {
        int mi=max(1,m-k+1);
        mi=mi+k-1-m+mi;
        int mx=min(n,m+k-1);
        mx=mx-k+1-m+mx;
        if(l>=mi && l<=mx && abs(m-l-k)%2 )
            return true;
        return false;
    }
    int main()
    {
        freopen("H.in","r",stdin);
        freopen("H.txt","w",stdout);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int m,n,l,k;
            scanf("%d%d%d%d",&n,&m,&k,&l);
            if(is_ok(n,m,k,l))
                printf("Miao\n");
            else
            {
                int i;
                for(i=1;i<=n;i++)
                {
                    // 从m到i可行,但是从i到l不可行,两人sb死循环
                    if(is_ok(n,m,k,i)==true&&is_ok(n,i,k,l)==false)
                    {
                        printf("Draw\n");
                        break;
                    }
                }
                if(i==n+1)
                    printf("Wang\n");
            }
        }
        return 0;
    }
    View Code
    60
    2 1 2 2
    3 1 1 2
    5 1 2 2
    5 5 2 3
    5 5 2 2
    2 1 1 2
    2 2 1 1
    2 1 2 2
    2 2 2 1
    3 1 1 2
    3 1 1 3
    3 2 1 1
    3 2 1 3
    3 3 1 1
    3 3 1 2 
    3 1 2 2
    3 1 2 3
    3 2 2 1
    3 2 2 3
    3 3 2 1
    3 3 2 2
    3 1 3 2
    3 1 3 3
    3 2 3 1
    3 2 3 3
    3 3 3 1
    3 3 3 2
    10 1 8 5
    9 3 3 9
    6 6 4 2
    6 1 3 4
    8 2 5 7
    9 6 8 7
    7 6 2 2
    10 3 9 10
    10 5 10 6
    10 4 2 3
    8 8 1 6
    10 5 9 8
    9 8 7 4
    10 9 2 10
    9 7 3 6
    5 3 2 1
    9 1 5 6
    7 7 3 4
    8 3 8 5
    10 10 9 5
    1000000 131525 705444 275309
    1000000 251567 705444 6097
    1000000 804588 705444 292263
    1000000 791181 347709 721626
    1000000 43795 347709 506697
    1000000 595477 347709 275837
    1000000 157692 569590 680270
    1000000 141323 569590 144412
    1000000 127671 569590 464318
    1000000 418768 623197 388979
    1000000 205057 623197 459153
    1000000 187669 623197 410751
    1000000 279207 267101 658544
    H.in
    Miao
    Draw
    Miao
    Wang
    Draw
    Draw
    Draw
    Miao
    Miao
    Draw
    Draw
    Draw
    Draw
    Draw
    Draw
    Miao
    Wang
    Miao
    Miao
    Wang
    Miao
    Draw
    Miao
    Draw
    Draw
    Miao
    Draw
    Wang
    Draw
    Wang
    Draw
    Draw
    Draw
    Draw
    Draw
    Miao
    Miao
    Draw
    Draw
    Miao
    Miao
    Draw
    Draw
    Draw
    Draw
    Draw
    Draw
    Wang
    Draw
    Miao
    Draw
    Wang
    Miao
    Wang
    Draw
    Miao
    Draw
    Miao
    Wang
    Draw
    H.out
  • 相关阅读:
    ZH奶酪:JavaScript中的JSON.stringify() and JSON.parse()
    ZH奶酪:PHP中添加HTML代码的三种方法
    ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法
    ZH奶酪:JavaScript清空数组的三种方法
    ZH奶酪:AngularJS判断checkbox/复选框是否选中并实时显示
    ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量
    ZH奶酪:PHP如何判断提交表单中多个复选框是否选中?
    ZH奶酪:PHP解析URL及parse_url、parse_str、explode、implode函数说明
    ZH奶酪:Ubuntu14.04 安装Android SDK(SDK tools only)
    ZH奶酪:Word断字功能不可用。请运行Microsoft Office安装程序安装该功能,然后重试。
  • 原文地址:https://www.cnblogs.com/overflow/p/3134862.html
Copyright © 2020-2023  润新知