题解 | 明日DISCO

明日DISCO

https://www.nowcoder.com/practice/5f28e16c1c934fa9bfd78d80292e99d5

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

全部评论

相关推荐

找工作勤劳小蜜蜂:矛盾是没有实习,就是没实战经验,公司不想要,公司不要,你就没有实习,你就进入死循环,另外你的项目不是社会现在有大量岗位存在行业用的,云存储人员早就饱和。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务