B - Incredible Chess LightOJ - 1186 -NIM博弈

  • B - Incredible Chess

  •  LightOJ - 1186 
  • 知识:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,
  • 如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动):
  • 对于一个Nim游戏的局面(a1,a2,...,an),它是先手必败态为当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。
  • 题意:下棋,每一列又两个棋,一个黑色,一个白色,白色先走可以向上或向下走任意步,但不能跳过对面旗子下棋
  • 无法下一步是停止。
  • 思路:这个任意步类似与NIM博弈的每一堆可以取任意个,(也许会有往后退的情况,但那些情况都不利于它赢。
  • 也就是说往后退是一个无用的策略,那忽略掉往后退,只剩下中间的空格就是 b[i]-w[i]-1)然后取异或判断即可
  • #include<bits/stdc++.h>
    using namespace std;
    int t,n,w[223],b[221],ans;
    int main()
    {
        scanf("%d",&t);
        for(int q=1; q<=t; q++)
        {
            scanf("%d",&n);
            printf("Case %d: ",q);
            for(int i=1; i<=n; i++)
                scanf("%d",&w[i]);
            for(int i=1; i<=n; i++)
                scanf("%d",&b[i]);
            ans=0;
            for(int i=1; i<=n; i++)
                ans^=(b[i]-w[i]-1);
            if(ans==0)printf("black wins\n");
            else printf("white wins\n");
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/83900650