题意:给两种黑白棋子,每一列均只有两种棋子各一枚,且棋子只能上下移动,谁最后无路可走谁输。
思路:同上一题一样需要计算每一列中黑白棋子之间相差的格子数,因为本题可以两个方向移动,所以不能单纯将格子加起来去模2,需要用到尼姆博弈的思想将每列格子数异或起来,如果是0先手必败(白子先行)否则先手胜。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <string>
#include <set>
#include <map>
const int maxn = 10005;
const int maxm = 640010;
const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f;
using namespace std;
int main() {
int t;
int cas = 1;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
int w[350], b[350];
for (int i = 1; i <= n; i++)
scanf("%d", &w[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
int sum = 0;
for (int i = 1; i<=n; i++)
{
sum ^= (b[i] - w[i] - 1);
}
if (sum == 0)
printf("Case %d: black wins\n", cas++);
else
printf("Case %d: white wins\n", cas++);
}
return 0;
}