题目大意:现在给出定义:‘.’表示空白,’#‘表示墨水,在一张白纸上可以把一个33区域除中心一个方格外全染上墨水,除以对除网格的边界以外任何网格染色。给出一个nm的区域图案,问是否能把一张白纸(全是’.’)染成那个图案
###
#. #
###
题目链接:http://codeforces.com/contest/1059/problem/B
题目思路:对每个非边界格子尝试染色,若染出的墨水数与给出的相同,输出’YES’,否则输出’NO’
c++代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1005;
char a[maxn][maxn];
int dx[8]={0,1,0,-1,-1,1,1,-1};
int dy[8]={1,0,-1,0,1,-1,1,-1};
int main() {
int m,n;
cin >> n >> m;
int t=0;
char c=getchar();
//cout << c <<endl;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> a[i][j];
if(a[i][j]=='#')t++;
}
getchar();
//cout << i <<endl;
}
// cout <<"?" <<endl;
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) {
if(i==0||i==n-1||j==0||j==m-1)continue;
int tmp=0;
for(int k=0;k<8;k++) {
int x=i+dx[k],y=j+dy[k];
if(x<0||x>n-1||y<0||y>m-1)continue;
if(a[x][y]=='#'||a[x][y]=='?'){
tmp++;
}
}
//如果旁边8个都是墨水说明是一个可染色点,对其进行标记
if(tmp==8) {
for(int k=0;k<8;k++) {
int x=i+dx[k],y=j+dy[k];
if(x<0||x>n-1||y<0||y>m-1)continue;
if(a[x][y]=='#'){
a[x][y]='?';
cnt++;
}
}
}
}
if(cnt==t)cout << "YES" <<endl;
else cout << "NO" <<endl;
return 0;
}