思路:这题你要发现题目的漏洞,保证所有的数都相等,那么处于0和处于n+1位置的所有数一直是0(也就是棋盘边上的一圈位置一直是0),因为其不能被调整。那么就转换为了将所有数都按照规则转换全部都转换为0即可。要求是比周围都大可以减一,比周围都小加一,但是如果两个相邻数都是正数,那么变换到最后最多就是相等,永远不会减到0,两个相邻的负数也是如此最后加到两个数相等,永远不会为0。那么就要排除这种相邻同号的数,直接两层循环能过遍历判断即可!(数据量比较小哈,暴力枚举就过了),纯纯思维题,一定要考虑负数情况!因为如果相邻两个数异号最后负数部分会加到0或者正数减到0,满足一个数周围都是0,最后操作完这一圈5个数一定都为0!!!细心一点不难哈!
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int n;
cin >> n;
vector<vector<int>>a(n + 2, vector<int>(n + 2));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
bool res = true;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][j] > 0 && (a[i - 1][j] > 0 || a[i][j - 1] > 0 || a[i + 1][j] > 0 ||
a[i][j + 1] > 0)) {
res = false;
} else if (a[i][j] < 0 && (a[i - 1][j] < 0 || a[i][j - 1] < 0 ||
a[i + 1][j] < 0 || a[i][j + 1] < 0)) {
res = false;
}
}
}
cout << (res == true ? "YES" : "NO") << endl;
}
signed main() {
ios::sync_with_stdio(false), cout.tie(0), cin.tie(0);
int t = 1;
while (t--) {
solve();
}
return 0;
}

京公网安备 11010502036488号