本文共 1600 字,大约阅读时间需要 5 分钟。
题目大意:
给出一个n*m的图案,你有一个印章,印章可以印出3*3的图案(图案是#),但中心的那一个点印不出来,印出来就像这样
问是否可以用印章印出那样的图案(可以覆盖印,但如果要印,整个印章都需在团内,不能像印章在左上角印,只印了一部分在图案上)题解:
根据给出的图案我们来印一个图案。开始图案都是‘.’,扫一遍给出的图案(枚举中心那个点),因为中心那个点是不会印上的,所以不用管它,只要中心点的周围一圈全都是'#',那么我们就可以印,就在我们的图案上,把这一圈都赋为‘#’。最后把我们画出的图和原图案比对,如果一致就是YES,否则就是NO
在此diss出题人的毛式英语,真真是说了些神马,题意描述的一点也不清,还一连发了3条解释,不好意思看了解释我也还没明白题意,还是在和队友的交互中逐渐明白了题意......
#include#include #define mod 1000000007#define INF 1000000007using namespace std;typedef long long ll;int dx[]= {-1,0,1};int dy[]= {-1,0,1};int n,m;char a[1010][1010];char t[1010][1010];bool pd(int x,int y){ for(int i=0; i<3; ++i) for(int j=0; j<3; ++j) { if(i==1 && j==1)continue; if(x+dx[i]<1 ||x+dx[i]>n || y+dy[i]<1 || y+dy[i]>m||a[x+dx[i]][y+dy[j]]!='#') return 0; } return 1;}void tu(int x,int y){ for(int i=0; i<3; ++i) for(int j=0; j<3; ++j) { if(i==1 && j==1)continue; t[x+dx[i]][y+dy[j]]='#'; }}bool d(){ for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) if(t[i][j]!=a[i][j]) return 0; return 1;}int main(){ //freopen("input.txt","r",stdin); cin>>n>>m; for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) cin>>a[i][j]; bool flag=1; for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) t[i][j]='.'; for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j)//(i,j)是中心点 if(pd(i,j)) tu(i,j); if(d()==0)//如果图案不一致 flag=0; if(flag) puts("YES"); else puts("NO"); return 0;}
转载地址:http://nkfgf.baihongyu.com/