最大黑区域

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

数据输入:

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

  

原文地址:https://www.cnblogs.com/chen-1/p/9463218.html

时间: 2024-10-10 17:21:42

最大黑区域的相关文章

最大黑区域(OJ7736/7852/7863)

"KKT数据结构805最大黑区域271同254" "KKT基本算法903最大黑区域437同454" "KKT基本算法1003最大黑区域454同437和271" 本题在OJ上有三个,因为是搜索的经典题.所以我也就不厌其烦的刷题了 "搜索"默认指"深度优先搜索"(DFS),不解释: #include<iostream> #include<cstdio> using namespace s

二、搜索

1.红与黑(codevs2806) 题目网址:http://codevs.cn/problem/2806/ 代码: var s:array[0..21,0..21] of char; i,j,sum,w,c,x,y:longint; procedure m(a,b:longint); begin inc(sum); s[a,b]:='#'; if(s[a+1,b]='.') then begin m(a+1,b); end; if(s[a-1,b]='.') then begin m(a-1,b

在Opencv中实现Matlab的bwareaopen函数功能

在Matlab中,我们通常利用bwareaopen函数去除八邻域内面积小于一定值的连通域. matlab函数bwareaopen──删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域. Opencv里没有特定的函数实现该功能,但我们可以自己设计一个孔洞填充/小区域去除的方式来实现. 函数接口设计如下: C++ void RemoveSmallRegion(Mat& Src, Mat& Dst, int

ACM 图像有用区域

图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 “ACKing”同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色.       图1                                                        图2 已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点).

形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽

一.开运算 开运算,就是先腐蚀后膨胀的过程 数学表达式: dst = open(src,element) = dilate(erode(src, element)) 开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积. 二.闭运算 闭运算,就是先膨胀后腐蚀的过程 数学表达式: dst = open(src,element) = erode(dilate(src, element)) 闭运算可以用来排除小型黑洞(黑色区域) 三.形态学梯度 形态学梯度,就是

全局文件,错误页,静态页,IIS配置及防黑

添加全局应用程序类. <%@ Application Language="C#" %> <script runat="server"> //整个网站第一次被访问的时候调用 void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 Application.Lock(); Application["web"] = "welcome&quo

nyoj--图像有用区域

描述 "ACKing"同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色.       图1                                                        图2 已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0的点). 输入 第一行输入测试数据的组数N(0<N<=6) 每组测试数据的

nyoj 92 图像有用区域 【bfs】

图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 "ACKing"同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑色线圏成的区域以内的图片,现在请你来帮助他完成第一步,把黑色线圏外的区域全部变为黑色.       图1                                                        图2 已知黑线各处不会出现交叉(如图2),并且,除了黑线上的点外,图像中没有纯黑色(即像素为0

形态学滤波:(1)腐蚀与膨胀 (2)开运算,闭运算,形态学梯度,顶帽,黑帽

一.形态学概述 图像处理中的形态学一般指的是数学形态学. 数学形态学是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论.其基本运算包括:二值腐蚀和膨胀,二值开闭运算,骨架抽取,极限腐蚀,击中击不中变换,形态学梯度,top-hat变换,颗粒分析,流域变换,灰值腐蚀和膨胀,灰值开闭运算,灰值形态学梯度等. 简单来讲,形态学操作就是基于形状的一系列图像处理操作. 二.形态学滤波 (1)腐蚀与膨胀 膨胀和腐蚀能实现多种多样的功能,主要如下: 消除噪声: 分割(isolate)