题目:
天气预报频道每天从卫星上接受卫星云图。图片被看作是一个矩阵,每个位置上要么是”#”,要么”.”,”#”表示该位置没有云,”.”表示有云,地图上每个位置有多达8个相邻位置,分别是,左上、上、右上、左、右、左下、下、右下8个方向,一块云是由连续的”.”组成。
例如:下面的卫星云图有4块云:
#####.#####
####.####.#
###..##.#.#
##...######
######.....
###########
如果当云的大小大于等于4的时候会产生台风,那么上图有将会产生2个台风,分别用1和2表示:
#####1#####
####1####.#
###11##.#.#
##111######
######22222
###########
给你一幅卫星云图和形成台风所需云的大小,要你计算出有几个台风以及最大台风的大小。我们用云的大小表示台风的大小。
分析:
简单,枚举每一个点,假如是‘.’,那么进行宽搜,向八个方向扩展,加入队列,更新为‘#’。
再判断是否大于k.......
操作十分简单,AC。
code:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,m,k; 7 int sum; 8 int ans; 9 int maxn=-999; 10 char a[1001][1001]; 11 int ax[1000000]; 12 int ay[1000000]; 13 void bfs(int x,int y) { 14 int head=0; 15 int tail=1; 16 ax[tail]=x; 17 ay[tail]=y; 18 int dx[8]= {1,0,-1,0,1,-1,1,-1}; 19 int dy[8]= {0,1,0,-1,1,1,-1,-1}; 20 do { 21 head++; 22 for(int i=0; i<8; i++) { 23 int nx=ax[head]+dx[i]; 24 int ny=ay[head]+dy[i]; 25 if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]=='.') { 26 tail++; 27 ax[tail]=nx; 28 ay[tail]=ny; 29 a[nx][ny]='#'; 30 sum++; 31 } 32 } 33 } while(head<tail); 34 } 35 int main() { 36 freopen("storm.in","r",stdin); 37 freopen("storm.out","w",stdout); 38 scanf("%d%d",&n,&m); 39 for(int i=1; i<=n; i++) 40 for(int j=1; j<=m; j++) 41 cin>>a[i][j]; 42 scanf("%d",&k); 43 for(int i=1; i<=n; i++) { 44 for(int j=1; j<=m; j++) { 45 if(a[i][j]=='.') { 46 sum=0; 47 bfs(i,j); 48 if(sum>=k) { 49 ans++; 50 maxn=max(maxn,sum); 51 } 52 } 53 } 54 } 55 printf("%d %d",ans,maxn); 56 return 0; 57 }