Codeforces Round #514 (Div. 2) B. Forgery (暴力?)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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; 
}

猜你喜欢

转载自blog.csdn.net/PK__PK/article/details/82969858
今日推荐