Codeforces Round #228 (Div. 2)B. Fox and Cross
2014-02-04 09:55
1161 查看
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.
![](http://espresso.codeforces.com/847cb0bb04204418c35604e1d8aa5a80be062087.png)
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
output
input
output
input
output
input
output
input
output
Note
In example 1, you can draw two crosses. The picture below shows what they look like.
![](http://espresso.codeforces.com/0d13c60e1d2c524d94d834706cc194f821b565f2.png)
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.
解题报告:
此题解法就是是否能用若干个十字形的图案拼成。代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[111][111];
int vis[111][111];
int main(){
int t,flag;
flag=0;
memset(vis,0,sizeof(vis));
scanf("%d",&t);
for(int i=0;i<t;i++)
scanf("%s",s[i]);
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
if(s[i][j]=='#'&&!vis[i][j]){
if((s[i-1][j]=='#'&&s[i+1][j]=='#'&&s[i][j-1]=='#'&&s[i][j+1]=='#')&&(!vis[i-1][j]&&!vis[i+1][j]&&!vis[i][j-1]&&!vis[i][j+1])){
vis[i-1][j]=1;vis[i+1][j]=1;vis[i][j-1]=1;vis[i][j+1]=1;vis[i][j]=1;
s[i-1][j]='.';s[i+1][j]='.';s[i][j-1]='.';s[i][j+1]='.';s[i][j]='.';
}
}
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
if(s[i][j]=='#')
flag=1;
if(flag)
printf("NO\n");
else
printf("YES\n");
return 0;
}
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.
![](http://espresso.codeforces.com/847cb0bb04204418c35604e1d8aa5a80be062087.png)
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.
![](http://espresso.codeforces.com/0d13c60e1d2c524d94d834706cc194f821b565f2.png)
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.
解题报告:
此题解法就是是否能用若干个十字形的图案拼成。代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[111][111];
int vis[111][111];
int main(){
int t,flag;
flag=0;
memset(vis,0,sizeof(vis));
scanf("%d",&t);
for(int i=0;i<t;i++)
scanf("%s",s[i]);
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
if(s[i][j]=='#'&&!vis[i][j]){
if((s[i-1][j]=='#'&&s[i+1][j]=='#'&&s[i][j-1]=='#'&&s[i][j+1]=='#')&&(!vis[i-1][j]&&!vis[i+1][j]&&!vis[i][j-1]&&!vis[i][j+1])){
vis[i-1][j]=1;vis[i+1][j]=1;vis[i][j-1]=1;vis[i][j+1]=1;vis[i][j]=1;
s[i-1][j]='.';s[i+1][j]='.';s[i][j-1]='.';s[i][j+1]='.';s[i][j]='.';
}
}
for(int i=0;i<t;i++)
for(int j=0;j<t;j++)
if(s[i][j]=='#')
flag=1;
if(flag)
printf("NO\n");
else
printf("YES\n");
return 0;
}
相关文章推荐
- Codeforces Round #228 (Div. 2) B Fox and Cross(DFS)
- Codeforces Round #228 (Div. 2) B. Fox and Cross
- Codeforces Round #228 (Div. 2) C. Fox and Box Accumulation
- Codeforces Round #228 (Div. 2), problem: (A) Fox and Number Game
- Codeforces Round #228 Div1 B Fox and Minimal path
- Codeforces Round #228 (Div. 1) A. Fox and Box Accumulation 贪心
- Codeforces Round #228 (Div. 1) B. Fox and Minimal path
- Codeforces Round #228 (Div. 2) A. Fox and Number Game
- Codeforces Round #290 (Div. 1)B. Fox And Jumping
- Codeforces Round #290 (Div. 2) C. Fox And Names 拓扑排序
- C. Fox And Names Codeforces Round #290 (Div. 2)
- Codeforces Round #290 (Div. 2) E Fox And Dinner
- Codeforces Round #290 (Div. 2)-C. Fox And Names
- Codeforces Round #290 (Div. 2) C. Fox And Names dfs
- Codeforces Round #228 Fox and Card Game 解题报告
- Codeforces Round #290 (Div. 2) B. Fox And Two Dots
- Codeforces #228 (Div. 2)C. Fox and Box Accumulation
- Codeforces Round #290 (Div. 2) - C. Fox And Names (拓扑排序)
- Codeforces Round #290 (Div. 1) A. Fox And Names
- Codeforces Round #290 (Div. 2) D. Fox And Jumping dp