十字架

题目描述
小D 是虔诚的嘟嘟教徒。现在小G 送他了一幅著名画家芬达奇的作品。这是
一幅n n 的作品,由”.” 或者”#” 构成,其中”.” 相当于空白。但是现在小D 怀疑
小G 送给他了一幅赝品。正版芬达奇的画作,是由若干个互不重叠的十字架拼起
来的。每个十字架由五个”#” 组成,如下:
.#.
###
.#.
而赝品则不能将所有的”#” 分成若干个互不重叠的十字架,如:
.#..
####
.#..
特别地,如果一幅画里面全都是”.”,这仍然是一幅正品。
你的任务是帮助小D 判断,小G 送他的这幅画到底是不是正品。
输入格式
输入文件第一行一个数字n,含义如题目所述。
第2 行到第n + 1 行,每行n 个’.’ 或者’#’,描述整张画。
输出格式
输出文件一行,如果是正品,输出”YES”;如果是赝品,输出”NO”。
样例输入1
5
.#...
####.
.####
...#.
.....
样例输出1
YES
样例输入2
4
####
####
####
####
样例输出2

NO

数据范围
40% 数据,1 n 10
70% 数据,1 n 50
100% 数据,1 n 100



我的想法:定义一个布尔数组判断能否构成十字架,构成十字架的依据是包括该点上下左右都是#(开始就忽略了点本身的条件,于是一直在找错,,),这是一道比较简单的搜索题,上代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool b[10100][10100]={0};
int n;
int i,j;
int xx,yy;
int dfs(int xx,int yy)
{ 
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&b[xx][yy])
{
if(b[xx+1][yy]&&b[xx-1][yy]&&b[xx][1+yy]&&b[xx][yy-1])
{ b[xx][yy]=0;
b[xx+1][yy]=0;
b[xx-1][yy]=0;
b[xx][yy+1]=0;
b[xx][yy-1]=0;
}
}
}
int main()
{
cin>>n;
char ch;
for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
 {
  cin>>ch;
  if(ch=='.')b[i][j]=0;
  if(ch=='#')b[i][j]=1;  
 }
 for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
 {
  if(b[i][j])dfs(i,j);//开始写的是dfs(1,1)于是只要开头输入的是#就会爆掉,很玄学的东西,,
 }  
 for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
 {
  if(b[i][j])
 {
  cout<<"NO";
  return 0;
 }
 }
 cout<<"YES";  
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值