对于每个位置,我们都贪心的尝试修改,如果可以修改,就把它修改为四个方向中的最大值和最小值(具体看它满足哪个条件)。其实这里修改后的值不为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";
}