卫星照片

来源:互联网 发布:淘宝发布图片尺寸 编辑:程序博客网 时间:2024/04/29 11:56

题目

农夫 John 正在研究他的农场的卫星照片.照片为一个R (1 <=

R <= 75) 行  C (1 <= C <= 75) 列的字符矩阵表示.如下图:

..................

..#####.......##..

..#####......##...

..................

#.......###.....#.

#.....#####.......      

图上的一块相连通的 "#" 表示一群奶牛或一个房间, 两个子"#" 连通的意思是说左右或上下相连.而下面的两块则是分开的:

....

.#..

..#.

....

John现在根据卫星照片上的的这些"#"块的形状来判断哪些是牛群,哪些是房间.如果一个"#"块形状的边是水平或垂直的矩形,则是房间.其它的则认为都是牛群.在第一个图中,有三个房间 ( 2x1, 2x5, and 1x1)和2群牛.

请根据输入文件中的数据,统计出房间数和牛群数.

数据中牛群不会包围另一个牛群或房间.

Input

* 第一行,两个整数: R 和 C.

* 和 2..R+1行: 第 i+1 行表示照片的第 i 行情况,由 C 字符组成.

Output

* 第一行: 房间数.

* 第二行: 牛群数.

Sample Input

5 8#####..######.##......#..###...#.###..##

Sample Output

22

Code

#include<iostream>#include<cstdio>using namespace std;int a[101][101],max1,max2,min1,min2,sum,n,m;int dr[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int pd(int x,int y){    if(x>n || x<1 || y<1 || y>m)return 0;    return 1;}void dfs(int x,int y){a[x][y]=0;    sum++;    max1=x>max1?x:max1;    max2=y>max2?y:max2;    min1=x<min1?x:min1;    min2=y<min2?y:min2;    for(int i=0;i<4;i++){        int xx=x+dr[i][0],yy=y+dr[i][1];    if(a[xx][yy]==1 && pd(xx,yy))      dfs(xx,yy);}}int main(){int i,j,k;freopen("satel.in","r",stdin);freopen("satel.out","w",stdout);cin>>n>>m;char c;getchar();for(i=1;i<=n;i++){  for(j=1;j<=m;j++){    scanf("%c",&c);if(c=='#')a[i][j]=1;else a[i][j]=0;}      getchar();}int ans1=0,ans2=0;for(i=1;i<=n;i++)  for(j=1;j<=m;j++){      if(a[i][j]==1){        sum=0;        max1=0;max2=0;min1=10000000;min2=10000000;      dfs(i,j);      if(sum==(max1-min1+1)*(max2-min2+1))ans1++;      else ans2++;  }  }cout<<ans1<<endl<<ans2<<endl;return 0;}


1 0
原创粉丝点击