cf228 div2 B. Fox and Cross ( 贪心, 模拟)

题目给出一个图, 问图中所有的“#”能否恰好独立的组成十字架(一个#只能在一个十字架中)一开始用dfs写的好混乱。。 后面发现从左上到右下,如果一个#满足正好在中间且四周可以消去,那就一定要消去,否则就NO。这样枚举一遍就好了。

 

题目:

B. Fox and Cross
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Fox Ciel has a board with n rows and n columns. So, the board consists of n × n cells. Each cell contains either a symbol '.', or a symbol '#'.

A cross on the board is a connected set of exactly five cells of the board that looks like a cross. The picture below shows how it looks.

Ciel wants to draw several (may be zero) crosses on the board. Each cross must cover exactly five cells with symbols '#', and any cell with symbol '#' must belong to some cross. No two crosses can share a cell.

Please, tell Ciel if she can draw the crosses in the described way.

Input

The first line contains an integer n (3 ≤ n ≤ 100) — the size of the board.

Each of the next n lines describes one row of the board. The i-th line describes the i-th row of the board and consists of n characters. Each character is either a symbol '.', or a symbol '#'.

Output

Output a single line with "YES" if Ciel can draw the crosses in the described way. Otherwise output a single line with "NO".

Sample test(s)
Input
5
.#...
####.
.####
...#.
.....
Output
YES
Input
4
####
####
####
####
Output
NO
Input
6
.#....
####..
.####.
.#.##.
######
.#..#.
Output
YES
Input
6
.#..#.
######
.####.
.####.
######
.#..#.
Output
NO
Input
3
...
...
...
Output
YES
Note

In example 1, you can draw two crosses. The picture below shows what they look like.

In example 2, the board contains 16 cells with '#', but each cross contains 5. Since 16 is not a multiple of 5, so it's impossible to cover all.

 

 

 

代码:

 

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <queue>
 6 #include <stack>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <cstdlib>
11 using namespace std;
12 #define LL lolng long
13 
14 int n;
15 char G[105][105];
16 void init()
17 {
18     scanf("%d",&n);
19     getchar();
20 
21     for(int i=0;i<n;i++)
22     {
23         for(int j=0;j<n;j++)
24         {
25             scanf("%c",&G[i][j]);
26         }
27         getchar();
28     }
29 }
30 
31 bool inmap(int x,int y)
32 {
33     if(x>=0&&x<n &&y>=0&&y<n)
34         return true;
35     return false;
36 }
37 
38 int dx[]= {1,-1,0,0};
39 int dy[] ={0,0,1,-1};
40 
41 
42 int main()
43 {
44     init();
45     int cnt=0;
46     int mm=0;
47     for(int i=0;i<n;i++)
48     {
49         for(int j=0;j<n;j++)
50         {
51             if( G[i][j] =='#')
52             {
53                 mm++;
54                 cnt =1;
55                 for(int p=0;p<4;p++)
56                 {
57                     if(inmap(i+dx[p],j+dy[p])&&G[i+dx[p]][j+dy[p]]=='#')
58                         cnt++;
59                 }
60                 if(cnt==5)
61                 {
62                     G[i][j]='.';
63                     for(int p=0;p<4;p++)
64                     {
65                         G[i+dx[p]][j+dy[p]]='.';
66                     }
67                 }
68                 //flag = dfs(i,j);
69             }
70         }
71 
72     }
73     cnt=0;
74      for(int i=0;i<n;i++)
75     {
76         for(int j=0;j<n;j++)
77         {
78                 if(G[i][j] =='#')
79                 {
80                     cnt=1;
81                     break;
82                 }
83         }
84     }
85     if(!cnt||mm==0)cout<<"YES"<<endl;
86     else
87         cout<<"NO"<<endl;
88     return 0;
89 }

 

转载于:https://www.cnblogs.com/doubleshik/p/3537806.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值