卫星照片

题目描述

Farmer John正在研究他的农场的卫星照片。照片为一个R(1≤R≤75)行,C(1≤C≤75)列的字符矩阵表示.如下图:

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

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

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

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

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

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

输入输出格式

输入格式:

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

第二至R+1行,第i+1行表示照片的第i行情况,由C个字符组成。

输出格式:

第一行,一个整数,为房间数。

第二行,一个整数,为牛群数。

输入输出样例

输入样例:
5 8
#####..#
#####.##
......#.
.###...#
.###..##
输出样例:
2
2

思路:找四个角确定是房间还是牛群。
//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;
char b[101][101];
int c[101][101],n,m,t,ans,anss,maxx,maxy,minx,miny,ans1,ans2;
void dfs(int w,int x)
{
    t++;
    maxx=max(maxx,w);
    maxy=max(maxy,x);
    minx=min(minx,w);
    miny=min(miny,x);
    if(!c[w-1][x]&&w-1>0&&b[w-1][x]=='#'){c[w-1][x]=1;dfs(w-1,x);}
    if(!c[w][x-1]&&x-1>0&&b[w][x-1]=='#'){c[w][x-1]=1;dfs(w,x-1);}
    if(!c[w+1][x]&&w+1<=n&&b[w+1][x]=='#'){c[w+1][x]=1;dfs(w+1,x);}
    if(!c[w][x+1]&&x+1<=m&&b[w][x+1]=='#'){c[w][x+1]=1;dfs(w,x+1);}
    return;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)    
        for(int j=1;j<=m;j++)cin>>b[i][j];
    for(int i=1;i<=n;i++)    
        for(int j=1;j<=m;j++)
        {
            t=maxx=maxy=0;
            minx=n+1;miny=m+1;
            if(c[i][j]==0&&b[i][j]=='#')
            {
                c[i][j]=1,dfs(i,j);
                //cout<<maxx<<" "<<minx<<" "<<maxy<<" "<<miny<<endl; 
                if(t==(maxx-minx+1)*(maxy-miny+1))ans1++;
                else ans2++;
            }
        }            
    cout<<ans1<<"\n"<<ans2;
    return 0;
}
View Code

 



posted @ 2019-04-21 10:32  背‘水’一栈  阅读(246)  评论(0编辑  收藏  举报