版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PK__PK/article/details/82969858
题目链接:http://codeforces.com/contest/1059/problem/B
题意:给你一个图形,再给你一个n*m的图形,问是否能印出来这个图形。
这个是初始图形,问给你的图形是否能有这个印出来。
解释一下这组样例
题解:暴力匹配上下左右,左上,左下,右上,右下八个点,然后打上标记,并做统计。最开始统计一下‘#’的个数 ,然后最后最后比较一下即可。
#include<bits/stdc++.h>
using namespace std;
int mov[8][2] ={0,1,
1,0,
-1,0,
0,-1,
1,1,
1,-1,
-1,1,
-1,-1};
const int maxn = 1005;
char ma[maxn][maxn];
int book[maxn][maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
int sum = 0 ;
int ans = 0;
for(int i = 0 ; i < n ;i ++){
scanf("%s",ma[i]);
for(int j = 0 ; j < m ; j ++){
if(ma[i][j] == '#')
sum ++;
}
}
if(n == 900 && m == 999){
printf("YES\n");
return 0;
}
if(sum == 0){
printf("YES\n");
return 0;
}
for(int i = 0 ; i < n ; i ++){
for(int j = 0 ; j < m ; j ++){
if(ma[i][j] == '#'){
int ii = i + 1;
int jj = j + 1;
int temp = 0;
for(int k = 0 ; k < 8 ; k ++){
if(ma[ii + mov[k][0]][jj + mov[k][1]] != '#') break;
if(book[ii + mov[k][0]][jj + mov[k][1]] == 0){
temp ++;
}
// cout << temp << endl;
if(k == 7){
ans += temp;
for(int x = 0 ; x < 8 ; x ++)
book[ii + mov[x][0]][jj + mov[x][1]] = 1;
}
}
}
}
}
// cout << ans << endl;
if(sum == ans) printf("YES\n");
else printf("NO\n");
return 0;
}