图像分割
Time Limit:1000MS Memory Limit:65535K
题型: 编程题 语言: 无限制
描述
给定一个n行m列的二值图像,0为背景,1为前景物,请计算该图像中有多少块连续区域(由连接的1构成),并输出
最大的连续区域像点数。
判断两个区域是否连接采用四邻域判定,即一点仅与它的上下左右四个点相连。
输入格式
第一行两个正整数,n和m(n,m<=100)
此后n行,每行m个0或1
输出格式
输入连续区域数和最大连续区域像点数
输入样例
6 8
01111110
01000010
01011010
01000010
01111110
00000001
输出样例
3
18
思路:十分经典的题目,dfs跑一下就行了,注意边缘。
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
char a[110][110];
int visit[110][110],n,m,roomnum,Maxroomarea,roomarea;
void dfs(int i,int j)
{
if(i<0||i>=n||j<0||j>=m)return;
if(visit[i][j]||a[i][j]=='0')return;
visit[i][j]=1;
roomarea++;
dfs(i+1,j);
dfs(i-1,j);
dfs(i,j+1);
dfs(i,j-1);
}
int main()
{
Maxroomarea=-1;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visit[i][j]&&a[i][j]=='1'){
roomarea=0;
roomnum++;
dfs(i,j);
Maxroomarea=max(Maxroomarea,roomarea);
}
}
}
cout<<roomnum<<endl<<Maxroomarea<<endl;
}