题目描述
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 #####..# #####.## ......#. .###...# .###..##
输出样例:
View Code
2 2
思路:找四个角确定是房间还是牛群。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
//程序名:新的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; }