Codeforces Round #514 (Div. 2)--B. Forgery
阿新 • • 發佈:2018-12-13
博主連結
題目連結
題意:
給你一個nm的圖形,‘#’表示墨痕,問你能不能用一個33的印章蓋出這個圖形,印章只有邊有墨,中間一個格子沒墨,就是樣例的的樣子;
題解:
暴力nm64掃一遍每個點,如果這個點是‘#’,則判斷下可不可能是印章的一個點,如果有一個點不可能則直接列印“NO”。
程式碼:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
char s[1010][1010];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for ( int i = 5; i < n+5; i++)scanf("%s", s[i]+5);
int flag = 1;
for(int i=5;i<n+5;i++)
for (int j = 5; j < m+5; j++) {
if (s[i][j] == '#') {
flag = 0;
if (s[i + 1][j] == '#'&&s[i + 2][j] == '#'&&s[i][j + 1] == '#'&&s[i][j + 2] == '#'&&s[i + 1][j + 2] == '#'&&s[i + 2][j + 2] == '#'&&s[i + 2][j + 1] == '#')flag = 1;
else if (s[i][j - 1] == '#'&&s[i][j + 1] == '#'&&s[i + 1][j - 1] == '#'&&s[i + 2][j - 1] == '#'&&s[i + 1][j + 1] == '#'&&s[i + 2][j + 1] == '#'&&s[i + 2][j] == '#')flag = 1;
else if (s[i][j - 2] == '#'&&s[i][j - 1] == '#'&&s[i + 1][j - 2] == '#'&&s[i + 2][j - 2] == '#'&&s[i + 1][j] == '#'&&s[i + 2][j] == '#'&&s[i + 2][j - 1] == '#')flag = 1;
else if (s[i - 1][j] == '#'&&s[i - 1][j + 1] == '#'&&s[i - 1][j + 2] == '#'&&s[i][j + 2] == '#'&&s[i + 1][j] == '#'&&s[i + 1][j + 1] == '#'&&s[i + 1][j + 2] == '#')flag = 1;
else if (s[i - 1][j] == '#'&&s[i - 1][j - 1] == '#'&&s[i - 1][j - 2] == '#'&&s[i][j - 2] == '#'&&s[i + 1][j] == '#'&&s[i + 1][j - 1] == '#'&&s[i + 1][j - 2] == '#')flag = 1;
else if (s[i - 1][j] == '#'&&s[i - 1][j + 2] == '#'&&s[i - 2][j] == '#'&&s[i - 2][j + 1] == '#'&&s[i - 2][j + 2] == '#'&&s[i][j + 1] == '#'&&s[i][j + 2] == '#')flag = 1;
else if (s[i][j - 1] == '#'&&s[i][j + 1] == '#'&&s[i - 1][j - 1] == '#'&&s[i - 1][j + 1] == '#'&&s[i - 2][j - 1] == '#'&&s[i - 2][j] == '#'&&s[i - 2][j + 1] == '#')flag = 1;
else if (s[i][j - 1] == '#'&&s[i][j - 2] == '#'&&s[i - 1][j] == '#'&&s[i - 1][j - 2] == '#'&&s[i - 2][j] == '#'&&s[i - 2][j - 1] == '#'&&s[i - 2][j - 2] == '#')flag = 1;
if (!flag) {
printf("NO\n");
return 0;
}
}
}
printf("YES\n");
return 0;
}