Codeforces Round #514 (Div. 2) B. Forgery
阿新 • • 發佈:2018-12-13
題目大意:現在給出定義:‘.’表示空白,’#‘表示墨水,在一張白紙上可以把一個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;
}