-
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; }
B - Incredible Chess LightOJ - 1186 -NIM博弈
最新推荐文章于 2021-02-09 20:49:18 发布