题目:二值图像是由黑白两种像素组成的矩形点阵,图像识别的一个操作是求出图像中最大黑区域的面积。请设计一个程序完成这个操作。黑区域由黑像素组成,一个黑区域中的每个像素至少与该区域中的另一个像素相邻,规定一个像素仅与其上下左右的像素相邻。两个的不同的黑区域没有相邻的黑像素。一个黑区域的面积是其所含的像素数。
数据输入:
第一行有两个整数,n和m,1<=n,m<=100,分别表示二值图像的行和列。
后面的n行,每行有m个整数,都是0或1,第i行j列的数字表示二值图像的第i行j列的像素颜色,0表示白色,1表示黑色。
数据输出:
一行一个整数,表示最大黑区域的面积。
题解:这道题与瓷砖很像,只不过要一个max_s记录最大的答案,,先二重循环找到一个黑点,统计这个黑区域中有多少黑点(具体方法见瓷砖),并把走过的变成白点(不重复计数),再来个"打擂台"就行了。
完整代码如下:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int NR=100; int a[NR+5][NR+5]; bool flag[NR+5][NR+5]; int ans; int n,m; int max_s=-2147483647; void dfs(int x,int y) { ans++; flag[x][y]=0; if(x+1<=n && flag[x+1][y])//向下统计 { dfs(x+1,y); } if(x-1>=1 && flag[x-1][y])//向上统计 { dfs(x-1,y); } if(y-1>=1 && flag[x][y-1])//向左统计 { dfs(x,y-1); } if(y+1<=m && flag[x][y+1])//向右统计 { dfs(x,y+1); } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { char fei; scanf("%c",&fei); for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); if(a[i][j]) flag[i][j]=1; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(flag[i][j])//是否为黑点 { dfs(i,j); if(ans>max_s) { max_s=ans; } //打擂台 ans=0;//清空 } } } cout<<max_s;//输出 return 0; }