卫星照片

题目描述

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

 



转载于:https://www.cnblogs.com/2006hanziwei/p/10744074.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值