一块矩形板上有着‘#’与‘.’两种图形,Fox Ciel希望通过画十字覆盖所有的‘#’,当然也可以不画。十字必须是单独成立的,任意两个十字不能相交。输入矩形边长n与矩形图像,问FoxCiel能否通过画十字覆盖所有‘#’。十字图案如下。
方法是先判断‘#’的数量能否被5整除,不能,则输出“NO”;否则搜索所有的‘#’,并判断该‘#’的四周能否一起构成十字。能,则标记该5个‘#’,并继续搜索下一个‘#’;
否则跳过。如此循环直到搜索完所有的‘#’为止。此时若剩余‘#’的数量不为0,则输出“NO”,否则输出“YES”。
#include <cstdio>
#include <iostream>
using namespace std;
bool vis[105][105] = {0} ;
int jh = 0 ;
void cross(int i , int j) {
if (vis[i+1][j] && vis[i-1][j] && vis[i][j+1] && vis[i][j-1]) {
vis[i-1][j] = 0 ;
vis[i][j-1] = 0 ; vis[i] [j] = 0 ; vis[i][j+1] = 0 ;
vis[i+1][j] = 0 ;
jh -= 5 ;
}
int main() {
//freopen ("in.txt" , "r" , stdin) ;
int n ;
cin >> n ;
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
char temp ;
cin >> temp ;
if (temp == '#') {
vis[i][j] = 1 ;
jh ++ ;
}
}
}
if (jh % 5 != 0) cout << "NO" << endl ;
else if (jh == 0) cout << "YES" << endl ;
else {
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
if (vis[i][j]) cross(i , j) ;
}
}
if (jh == 0) cout << "YES" << endl ;
else cout << "NO" << endl ;
}
return 0;
}