对题目意思做一个解释。
你需要找到图中不安全的普通植物。
什么叫做不安全呢?在周围 八个位置中没有萝卜保护伞,就是不安全的。
我们直接暴力遍历地图,找到普通植物时判断它周围八个位置中有没有萝卜保护伞,计数即可。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 70;
char c[N][N];
int main () {
int T, n, m;
scanf ("%d", &T);
while (T --) {
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) {
scanf ("%s", c[i] + 1);
}
int res = n * m;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
if (c[i][j] == 'P') {//找到普通植物。
bool f = false;//判断周围是否有萝卜保护伞。
for (int k1 = i - 1; k1 <= i + 1; k1 ++) {
for (int k2 = j - 1; k2 <= j + 1; k2 ++) {
//遍历包括普通植物的3×3矩阵。
if (c[k1][k2] == '*' && k1 >= 1 && k2 >= 1 && k1 <= n && k2 <= m) {
//不能越出边界。
res --;//不安全的数量减一。
f = true;
break;
}
}
if (f == true) {
break;
}
}
}
else {
res --;//只要不是普通植物,都不会被偷走。
}
}
}
printf ("%d\n", res);
}
}