题解:CF1628C Grid Xor
神奇做法,被同学锐评在看懂题面之前就过题了。
题意
给出一个
题解
我们可以把题目转化为一个点灯游戏。有一个
点灯游戏可以这么做:每次看点灯位置的左侧和上侧相邻元素有没有被点亮(假设超出边界的所有灯怎么点都不会亮),都没被点亮就选择该位置点灯。
上图展示了
++
++++
++
经过简单的讨论后我们就证明了这种方案可以使得
代码:
#include<iostream>
using namespace std;
bool vis[1001][1001];//点灯情况
int a[1001][1001];
int main(){
int T;
cin >> T;
while(T--){
int n;
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin >> a[i][j];
vis[i][j]=false;
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if((i-1>=1 && vis[i-1][j]) || (j-1>=1 && vis[i][j-1])){
continue;//左侧或上侧的灯被点了,这次的点灯就跳过
}
if((i-1>=1)) vis[i-1][j]^=1;
if(i+1<=n) vis[i+1][j]^=1;
if(j-1>=1) vis[i][j-1]^=1;
if(j+1<=n) vis[i][j+1]^=1;
ans^=a[i][j];
}
}
cout << ans << '\n';
}
return 0;
}
附注
对于