https://ac.nowcoder.com/acm/contest/120565/H
纯观察题,新增知识棋盘黑白染色。
首先目标是所有数字一样,那么所有数字的和一定是的倍数。注意到黑色、白色位置的和永远不变,所以黑/白位置的和也一定是黑/白格子数量的倍数。注意到:
1 1
-1 -1
和
1 -1
1 -1
叠加后:
2 0
0 -2
意味着同色位置只要奇偶性相同就可以变成一样。那么只需要判断是否有可能全棋盘奇偶性一样即可。
奇偶性要么和相同,要么不同,分类讨论即可。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[1010][1010],b[1010][1010];
long long read(){
char ch=getchar();long long x=0,f=1;
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
n=read();
if(n==1){
puts("Yes");
return 0;
}
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
a[i][j]=read();b[i][j]=a[i][j];
}
}
long long sum1=0,sum2=0,sum=0;
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j+=2){
if(i&1)
sum1+=a[i][j];
else
sum2+=a[i][j];
}
for(long long j=2;j<=n;j+=2){
if(i&1)
sum2+=a[i][j];
else
sum1+=a[i][j];
}
}
if((sum1%((n*n+1)>>1))||(sum2%(n*n>>1))){
puts("No");
return 0;
}
long long x=a[1][1]&1,ff=1;
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
if((a[i][j]&1)!=x){
if((j==n)||(i==n)){
ff=0;
}
a[i][j]++;
a[i][j+1]++;
a[i+1][j]--;
a[i+1][j+1]--;
}
}
}
if(ff){
puts("Yes");
return 0;
}
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
a[i][j]=b[i][j];
}
}
x^=1;
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
if((a[i][j]&1)!=x){
if((j==n)||(i==n)){
puts("No");
return 0;
}
a[i][j]++;
a[i][j+1]++;
a[i+1][j]--;
a[i+1][j+1]--;
}
}
}
puts("Yes");
return 0;
}

京公网安备 11010502036488号