对于每个位置,我们都贪心的尝试修改,如果可以修改,就把它修改为四个方向中的最大值和最小值(具体看它满足哪个条件)。其实这里修改后的值不为0,已经可以输出"NO"并return了。这是因为第0,n+1的行和列是不能修改的,要想使整个正方形棋盘的值都相等,只能整个棋盘上的数都为0。而且一个点已经像上述被修改过,无论后续的点怎么修改,也不能被二次修改了。遍历结束后说明可以使棋盘上的数均相等,输出"YES"。
#include <iostream>
#include <vector>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n;
std::cin >> n;
auto g = std::vector(n+2,std::vector<int>(n+2));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
std::cin >> g[i][j];
}
}
std::vector<int> dx = {-1,1,0,0};
std::vector<int> dy = {0,0,-1,1};
auto update = [&](int x,int y){
int min = 1E9+1,max = -1E9-1;
for(int i = 0; i < 4; i++){
int u = x+dx[i],v = y+dy[i];
min = std::min(min,g[u][v]);
max = std::max(max,g[u][v]);
}
if(max < g[x][y]){
g[x][y] = max;
}
if(min > g[x][y]){
g[x][y] = min;
}
};
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
update(i,j);
if(g[i][j] != 0){
std::cout << "NO\n";
return 0;
}
}
}
std::cout << "YES\n";
}

京公网安备 11010502036488号