当前位置:首页 > 题解目录 > 正文内容

【题解】黑色联通块

亿万年的星光2个月前 (02-22)题解目录316

【题目描述】

输入一个n×n的黑白图像(1表示黑色,0表示白色),任务是统计其中黑色连通块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个联通块。如下图所示的图形有3个联通块。

【输入描述】

第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。

【输出描述】

输出连通块的个数

【样例输入】

6
100100
001010
000000
110000
111000
010100

【样例输出】

3

【题目分析】

  1. 双队列版本,对比以前的单队列多了一个队列。

  2. 每遇到一个点,就调用广搜函数,处理当前这个连通块,并增加连通块计数

  3. bfs思路是不断从队列中取出像素,检查其8个方向的邻居:如果邻居是黑色且未被访问,则将其加入队列,并标记为已访问。直到队列为空,表示当前连通块已全部遍历


【整体思路】

1.遍历图像:逐行逐列遍历图像中的每个像素。

2.发现黑色像素:如果发现一个未被访问过的黑色像素,启动 BFS 或 DFS 来标记所有与之相连的黑色像素。

3.计数连通块:每次启动 BFS 或 DFS 时,增加连通块的计数。


【参考代码】

#include<iostream>
#include<queue>
#include<cstdio>
#define maxn 750
using namespace std;
int n,sum=0;
int a[maxn][maxn];
int x[8]={0,0,1,1,1,-1,-1,-1};
int  y[8]={1,-1,-1,0,1,-1,0,1};
void bfs(int,int);
string s;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		for(int j=0;j<n;j++) a[i][j+1]=s[j]-48;  //字符转数字
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]==1)
			{
				bfs(i,j);
				sum++;
			}
		}
	}
	cout<<sum;
	return 0;
}
void bfs(int i,int j)
{
	queue<int> qi,qj;  //分别存储当前连通块中像素的行和列索引
	qi.push(i);
	qj.push(j);
	a[i][j]=0;
	while(!qi.empty())
	{
		int ki=qi.front(),kj=qj.front();
		for(int i=0;i<8;i++)
		{
			int kx=ki+x[i],ky=kj+y[i];
			if(kx>=1&&kx<=n&&ky>=1&&ky<=n)
			{
				if(a[kx][ky]==1)
				{
					a[kx][ky]=0;
					qi.push(kx);
					qj.push(ky);
				}
			}
		}
		qi.pop();
		qj.pop();
	}
}



【后续改进】

  1. 可以使用pair进行改进


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

迷宫

【题目描述】一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个...

【题解】合根植物

【题解】合根植物

【题目描述】w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成...

【NOIP2000】计算器的改良

【题目描述】NCL 是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手 ZL...

【题解】登山

【题解】登山

【题目描述】五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不...

【题解】吃糖果

【题解】吃糖果

【题目描述】小明终于从小红手里赢走了所有的糖果,小明转变吃掉所有糖果,但是小明吃糖果有个特殊癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另外一种。试问小明是否存在一种吃糖果的顺序使得...

【题解】结构体与闰年

【题目描述】定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。【输入描述】年月日【输出描述】当年第几天【样例输入】2000 12 31【样例输出】366...