题目链接: Forgery
题目大意:
就是给你一张已经没法改动的签名,也就是你自己输入的那个方格,其中 '#'代表字迹,现在给你一张同样大小的空白纸,让你去操作(当你操作一个点时,这个点本身不变,他周围的八个点会变为‘#’),问能不能操作数次之后变成你输入的那个方格样式。
题目思路
思路就是,需要你改动的地方,卯了劲去改,不能改的地方就别乱动。那么关键就是什么地方需要我们去操作呢?当某一个点周围的八个点都是‘#’,那么我们就应该在那张空白纸上去操作这个点,当全部操作完毕,看看你输入的那个方格和你操作的那个方格是否一致就行。
#include <bits/stdc++.h>
using namespace std;
char a[1001][1001],c[1001][1001];
int judge(int x,int y) // 判断函数
{
if(a[x][y-1]=='#' && a[x][y+1]=='#' && a[x-1][y]=='#' && a[x-1][y-1]=='#' && a[x-1][y+1]=='#' && a[x+1][y-1]=='#' && a[x+1][y]=='#' && a[x+1][y+1]=='#')
return 1;
else
return 0;
}
void turnover(int x,int y)
{ //操作函数
c[x][y-1]='#';
c[x][y+1]='#';
c[x-1][y]='#';
c[x-1][y-1]='#';
c[x-1][y+1]='#';
c[x+1][y-1]='#';
c[x+1][y]='#';
c[x+1][y+1]='#';
}
int main()
{
int n,m,flag,i,j;
cin>>n>>m;
flag=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>a[i][j];
c[i][j]='.';
}
for(i=1;i<=n;i++) //看看此方格是否需要操作
for(j=1;j<=m;j++)
{
if(i!=1 && i!=n && j!=1 && j!=m && judge(i,j))
turnover(i,j);
}
for(i=1;i<=n;i++) //判断两个方格是否一致
for(j=1;j<=m;j++)
if(c[i][j]!=a[i][j])
{
flag=1;
break;
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}