A 十字架
time:1s memery:128MB
题目描述
小 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
记得一开始做这题的时候一点思路都没有,
可是别人那时候都已经AC了,果然是太菜了啊。
期望:100 实际:100
解:因为每个十字架都是不同的,所以枚举每个十字架
的中间处,如果是的话,把整个十字架变成‘.‘。
到最后扫一遍整个矩阵,如果还存在‘#‘,说明不合法
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<queue> 6 #include<cstring> 7 #include<string> 8 #include<map> 9 #define ll long long 10 #define DB double 11 #define eps 1e-3 12 #define inf 2147483647 13 #define mod 100000007 14 using namespace std; 15 inline int read() 16 { 17 int x=0,w=1;char ch=getchar(); 18 while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} 19 while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch-‘0‘),ch=getchar(); 20 return x*w; 21 } 22 int n; 23 char s[120][120]; 24 int dx[4]={0,0,1,-1}; 25 int dy[4]={1,-1,0,0}; 26 void work(int x,int y) 27 { 28 s[x][y]=‘.‘; 29 for(int i=0;i<=3;++i) 30 s[x+dx[i]][y+dy[i]]=‘.‘; 31 } 32 bool ok(int x,int y) 33 { 34 for(int i=0;i<=3;++i) 35 { 36 int xx=x+dx[i],yy=y+dy[i]; 37 if(xx<0 || xx>n || yy<0 || yy>n) return 0; 38 if(s[xx][yy]==‘.‘) return 0; 39 } 40 return 1; 41 } 42 int main() 43 { 44 freopen("puzzle.in","r",stdin); 45 freopen("puzzle.out","w",stdout); 46 n=read(); 47 for(int i=1;i<=n;++i) 48 scanf("%s",s[i]+1); 49 for(int i=1;i<=n;++i) 50 for(int j=1;j<=n;++j) 51 if(s[i][j]==‘#‘ && ok(i,j)) work(i,j); 52 for(int i=1;i<=n;++i) 53 for(int j=1;j<=n;++j) 54 if(s[i][j]==‘#‘){cout<<"NO";return 0;} 55 cout<<"YES"; 56 return 0; 57 }
差的人没有资格说话吧。