1. 程式人生 > >Codeforces Round #514 (Div. 2) B. Forgery

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; }