链接:并行博弈
分析
一开始只想着去骗分
结果发现是一道zz题
对于一个棋盘来说,其实只用关心一个关键点,就是左上角那个点。
因为不管选择哪个点,最左上角那个点一定会被翻转(每次操作翻转左上方所有点)
所以不管其他的怎么操作,只要一个人能把左上角的点点成白色,那下一个人必然会将它变成黑色,第一个人又可以选左上角的点。如此循环,另一个人必败。、
所以每个棋盘只需要看一开始左上角的点是什么颜色,黑色则先手必胜,白色则先手必败。
怎么处理多个棋盘?
因为如果这一盘你赢了,对方下一盘就变成先手了,反之亦然。所以说总的胜负其实跟先手必胜或先手必败棋盘的奇偶性有关。
有奇数个先手必胜棋盘则先手必胜,有偶数个先手必胜棋盘则先手必败。
判断这个可以用异或实现。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,k,n,m,a[500][500],ans;
int main()
{
cin>>t;
while(t--)
{
ans=0;
cin>>k;
while(k--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
ans=ans^a[1][1];
}
if(ans) cout<<"lyp win"<<endl;
else cout<<"ld win"<<endl;
}
return 0;
}