ZZULIACMer
这一题的主要思路就是确定可以下笔的位置,然后把所有可以下笔的位置在第二数组里反映出来,以后与第一数组一一对照即可
注意此类问题搜索时的数组越界的问题
#include<bits/stdc++.h>
using namespace std;
int dx[8]= {-1,-1,0,1,1,1,0,-1};
int dy[8]= {0,1,1,1,0,-1,-1,-1};
char ch[1010][1010],ar[1010][1010];
int mk [1010][1010];
int m,n;
void ans() {
for(int i=1; i<m-1; i++) //用于把‘。’周围的8个点位设置为不可下笔 0
for(int j=1; j<n-1; j++) { //可下笔设置为 1
if(ch[i][j] == '.') {
for(int k=0; k<8; k++) {
int nx = i+dx[k],ny = j+dy[k];
mk[nx][ny]=0;
}
}
}
for(int i=1; i<m-1; i++) // 新数组,开始下笔
for(int j=1; j<n-1; j++) {
if(mk[i][j]==1) {
for(int k=0; k<8; k++) {
int nx=i+dx[k],ny=j+dy[k];
ar[nx][ny] = '#';
}
}
}
bool f=1;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(ch[i][j] == '#' && ar[i][j]!='#') {
f=0;
}
}
}
if(f) cout<<"YES";
else cout<<"NO";
}
int main() { //main函数主要用于输入数据
while(cin>>m>>n) {
memset(mk,0,sizeof(mk));
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
cin>>ch[i][j];
}
}
for(int i=1; i<m-1; i++) //(m-1)*(n-1)的区域内才能下笔
for(int j=1; j<n-1; j++)
mk[i][j]=1;
ans();
cout<<endl;
}
}