zoukankan      html  css  js  c++  java
  • 最大黑区域

    题目:二值图像是由黑白两种像素组成的矩形点阵,图像识别的一个操作是求出图像中最大黑区域的面积。请设计一个程序完成这个操作。黑区域由黑像素组成,一个黑区域中的每个像素至少与该区域中的另一个像素相邻,规定一个像素仅与其上下左右的像素相邻。两个的不同的黑区域没有相邻的黑像素。一个黑区域的面积是其所含的像素数。

    数据输入:

    第一行有两个整数,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;
    }
    
                                    
    

      

  • 相关阅读:
    旅行,写作,编程
    Limu:JavaScript的那些书
    怎样花两年时间去面试一个人
    IE6之各种不适记录
    19位编程大师集锦
    开源中最好的Web开发资源汇总
    流行Linux和Windows脚本语言列表
    近来,一组名为“全球郁闷青年写真”的照片在网上热传...
    浏览器端技术体系概览 前端开发的七种武器
    这个世界从来没有任何一件工作叫“钱多、事少、离家近”
  • 原文地址:https://www.cnblogs.com/chen-1/p/9463218.html
Copyright © 2011-2022 走看看