附官方题解:
Each empty cell forbids to put a pen into every neighbor. Also, the border of the grid is forbidden. Let's mark all the forbidden cells. Now we have to check if for each filled cell there is at least one non-forbidden neighbor. Time complexity is O(nm).
我怎么就想不到呢!
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int n, m;
char temp[1005][1005];
bool vis[1005][1005];
void x(int x, int y) {
vis[x - 1][y - 1] = false;
vis[x - 1][y] = false;
vis[x - 1][y + 1] = false;
vis[x][y - 1] = false;
vis[x][y + 1] = false;
vis[x + 1][y - 1] = false;
vis[x + 1][y] = false;
vis[x + 1][y + 1] = false;
}
bool check(int x,int y) {
return vis[x - 1][y - 1] || vis[x - 1][y] || vis[x - 1][y + 1] || vis[x][y - 1] || vis[x][y + 1] || vis[x + 1][y - 1] || vis[x + 1][y] || vis[x + 1][y + 1];
}
int main() {
cin >> n >> m;
for (int i = 1;i <= n;++i) {
for (int j = 1;j <= m;++j) {
cin >> temp[i][j];
}
}
for (int i = 1;i <= n;++i) {
for (int j = 1;j <= m;++j) {
vis[i][j] = true;
}
}
for (int i = 1;i <= n;++i) {
vis[i][1] = false;
vis[i][m] = false;
}
for (int j = 1;j <= m;++j) {
vis[1][j] = false;
vis[n][j] = false;
}
for (int i = 1;i <= n;++i) {
for (int j = 1;j <= m;++j) {
if (temp[i][j] == '.') {
x(i, j);
}
}
}
bool flag = true;
for (int i = 1;i <= n;++i) {
for (int j = 1;j <= m;++j) {
if (temp[i][j] == '#') {
if (check(i, j) == false) {
flag = false;
}
}
}
}
if (flag) {
printf("YES\n");
}
else {
printf("NO\n");
}
//system("pause");
return 0;
}