码迷,mamicode.com
首页 > 其他好文 > 详细

2018 3.5下午自测

时间:2018-03-05 15:33:24      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:algorithm   没有   code   正品   ##   define   开始   turn   span   

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 }
安然流香

 

差的人没有资格说话吧。

 

2018 3.5下午自测

标签:algorithm   没有   code   正品   ##   define   开始   turn   span   

原文地址:https://www.cnblogs.com/adelalove/p/8508894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!