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;
}