题解 | 明日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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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