Codeforces Round #514 (Div. 2) B. Forgery

题目大意:现在给出定义:‘.’表示空白,’#‘表示墨水,在一张白纸上可以把一个33区域除中心一个方格外全染上墨水,除以对除网格的边界以外任何网格染色。给出一个nm的区域图案,问是否能把一张白纸(全是’.’)染成那个图案
###
#. #
###
题目链接:http://codeforces.com/contest/1059/problem/B
题目思路:对每个非边界格子尝试染色,若染出的墨水数与给出的相同,输出’YES’,否则输出’NO’
c++代码:


  #include <iostream>
#include <cstdio>

using namespace std;

const int maxn=1005;

char a[maxn][maxn];

int dx[8]={0,1,0,-1,-1,1,1,-1};
int dy[8]={1,0,-1,0,1,-1,1,-1};

int main() {
	int m,n;
	cin >> n >> m;
	int t=0;
	char c=getchar();
	//cout << c <<endl;
	for(int i=0;i<n;i++) {
		for(int j=0;j<m;j++) {
			cin >> a[i][j];
			if(a[i][j]=='#')t++;
		}
		getchar();
		//cout << i <<endl;
	}
	 // cout <<"?" <<endl;
	  int cnt=0;
	for(int i=0;i<n;i++)
	   for(int j=0;j<m;j++) {
	   	   if(i==0||i==n-1||j==0||j==m-1)continue;
	   	   	int tmp=0;
	   	    for(int k=0;k<8;k++) {
	   	    	  int x=i+dx[k],y=j+dy[k];
	   	    	  if(x<0||x>n-1||y<0||y>m-1)continue;
	   	    	  if(a[x][y]=='#'||a[x][y]=='?'){
	   	    	  	  tmp++;
					 }
			   } 
			    //如果旁边8个都是墨水说明是一个可染色点,对其进行标记
			   if(tmp==8) {
			   	   for(int k=0;k<8;k++) {
	   	    	     int x=i+dx[k],y=j+dy[k];
	   	    	      if(x<0||x>n-1||y<0||y>m-1)continue;
	   	    	  if(a[x][y]=='#'){
	   	    	  	  a[x][y]='?';
	   	    	  	  cnt++;
					 }
			       }
			   }
	   }
	if(cnt==t)cout << "YES" <<endl;
	else cout << "NO" <<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/82948883
今日推荐