1375 B. Neighbor Grid
题目大意:
给你一个矩阵,问这个矩阵能不能变成题目所描述的要求
题目要求:
- 初始矩阵中所有元素非负
- 你可以对任意元素 进行任意次 +1 操作
- 如果一个单元格的值 k = 0,则无要求,如果一个单元格的值 k > 0,与其相邻的单元格值 > 0 的个数也要为 k
思路分析:
先找到不可以的情况,四个角的值要 <= 2,四个边的值要 <= 3,中间的值要 <= 4,如果违反这些的话,直接输出 NO
然后我的想法是直接把矩阵填满,就是所有单元格都填上数字,四个角 = 2,四个边 = 3,中间 = 4
AC代码:
#include <iostream>
using namespace std;
const int N = 310;
int a[N][N];
int n, m;
int main() {
int t;
cin >> t;
while (t--) {
cin >> n >> m;
bool flag = false;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
cin >> a[i][j];
// 四个角(注意,四个角的if条件符合的时候,也符合四个边,所以可以 continue; 一下
if ((i == 0 || i == n - 1) && (j == 0 || j == m - 1) && a[i][j] > 2) {
flag = true;
continue;
}
if ((i == 0 || i == n - 1) && (j == 0 || j == m - 1) && a[i][j] <= 2) {
a[i][j] = 2;
continue;
}
// 四条边
if ((i == 0 || i == n - 1 || j == 0 || j == m - 1) && a[i][j] > 3) {
flag = true;
}
if ((i == 0 || i == n - 1 || j == 0 || j == m - 1) && a[i][j] <= 3) {
a[i][j] = 3;
}
// 中间部分
if (i > 0 && i < n - 1 && j > 0 && j < m - 1 && a[i][j] > 4) {
flag = true;
}
if (i > 0 && i < n - 1 && j > 0 && j < m - 1 && a[i][j] <= 4) {
a[i][j] = 4;
}
}
if (flag)
cout << "NO" << endl;
else {
cout << "YES" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << a[i][j] << ' ';
cout << endl;
}
}
}
return 0;
}