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

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

博主連結

題目連結

在這裡插入圖片描述

題意:

給你一個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; }