题解 | 明日DISCO
明日DISCO
https://www.nowcoder.com/practice/5f28e16c1c934fa9bfd78d80292e99d5
#include <iostream>
using namespace std;
using ll = long long;
const ll N=505;
ll a[N][N]; // 存储n×n棋盘的数值,数组开至505以适配题目中n≤500的范围
int main() {
// 步骤1:输入棋盘大小n和棋盘初始数值
ll n;
cin>>n;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
scanf("%lld",&a[i][j]); // 用scanf提升大数输入效率
}
}
// 步骤2:特殊情况处理——n=1时必然可以调整为0(唯一格子的上下左右都是边界0,可通过操作1/2调整)
if(n==1){
cout<<"YES";
return 0;
}
// 步骤3:核心判断逻辑——检查每个非0格子是否为"局部极值"(操作的前提条件)
// 算法思想:只有每个非0格子都是局部极值(正数则上下左右无正数,负数则上下左右无负数),才能通过操作逐步调整到0
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
// 跳过0值格子(已达目标状态,无需操作)
if(a[i][j]==0){
continue;
}
// 情况1:当前格子为负数,需是局部极小值(上下左右均不能为负数,否则不满足操作2的条件)
else if(a[i][j]<0){
// 检查上下左右四个方向(边界格子的i-1/j-1/i+1/j+1会是0,天然满足非负)
if(a[i-1][j]<0||a[i][j-1]<0||a[i+1][j]<0||a[i][j+1]<0){
cout<<"NO"; // 存在相邻负数,无法作为局部极小值执行操作2
return 0;
}
}
// 情况2:当前格子为正数,需是局部极大值(上下左右均不能为正数,否则不满足操作1的条件)
else if(a[i][j]>0){
// 检查上下左右四个方向(边界格子的相邻位为0,天然满足非正)
if(a[i-1][j]>0||a[i][j-1]>0||a[i+1][j]>0||a[i][j+1]>0){
cout<<"NO"; // 存在相邻正数,无法作为局部极大值执行操作1
return 0;
}
}
}
}
// 步骤4:所有非0格子均满足局部极值条件,可通过操作逐步调整为0
cout<<"YES";
return 0;
}

