给出一个老师的字迹,问能不能用一个3*3,中间空心的印章,印出老师的字迹。
要求:印章不能印出外边。
逆向思维,每一个空心的都不能在四周盖章。扫描一遍后,再扫描墨水印,如果存在一个墨水印是不能印出来的,则返回NO,否则返回YES
#include<iostream>
#include<cstring>
using namespace std;
string a[1005];
bool f[1005][1005];
int main()
{
// freopen("in.txt","r",stdin);
int n,m;
cin>>n>>m;
memset(f,true,sizeof(f));
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]=" "+a[i];
for(int j=1;j<=m;j++)
if(a[i][j]=='.')
{
for(int k1=i-1;k1<=i+1;k1++)
for(int k2=j-1;k2<=j+1;k2++)
if(!(k1==i&&k2==j))
{
f[k1][k2]=false;
}
}
}
for(int i=0;i<=n+1;i++)
{
f[i][1]=false;
f[i][0]=false;
f[i][m]=false;
f[i][m+1]=false;
}
for(int i=0;i<=m+1;i++)
{
f[1][i]=false;
f[0][i]=false;
f[n][i]=false;
f[n+1][i]=false;
}
bool flag=true;
for(int i=1;i<=n;i++)
if(!flag) break;else
for(int j=1;j<=m;j++)
if(a[i][j]=='#')
{
bool check=false;
for(int k1=i-1;k1<=i+1;k1++)
if(check) break;else
for(int k2=j-1;k2<=j+1;k2++)
if(!(k1==i&&k2==j)&&f[k1][k2]==true)
{
check=true;
break;
}
if(!check)
{
flag=false;
break;
}
}
if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
return 0;
}