家人们,今天来写深度优先里的联通块问题的分析🌶️!
首先来讲讲什么是连通块
连通块问题指在给定的图或矩阵中,寻找所有相互连通的元素组成的集合。连通性通常定义为相邻元素的直接或间接连接(如上下左右相邻或对角线相邻)。这类问题常见于图像处理、网络分析、迷宫求解等领域
而下面这道题就是一道典型的连通块问题
题目描述
一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符0到9的字符串,代表这个 n×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入输出样例
输入数据 1
4 10 0234500067 1034560500 2045600671 0000000089输出数据 1
4那么这种题怎么做❓️😄菲娜来讲🌶️
诸位作为💺C++の老朋友,主函数的输入不必说
输入后,将值传到☞函数dfs,需要多次循环时,需要一个☝if来判断此时的值是否是不是🙅♀️障碍,如果不是就上⬆️传,且计数++就完啦✌️
dfs部分主要就分为三步_(:з」∠)_
第一步 边界判断
判断是否不越界,且不是🙅♀️障碍物或不可走等
if(此行<1||此行>总行||此列<1||此列>总列||a[x][y](此处)==障碍物)
{
return ;(结束🔚)
}
第二步 标记📌
诸位想一下,我们在走完后如果不标记走过,是不是会像鬼👻打墙一样一直搜索下去❓️YES❗️所以我们要做标记.
两种方法:1. 设定一个状态数组,如flag[205][205];
flag[此行][此列]=1(表示已走标记📌);
2. 查看题目需求,如果可以,咱就直接用原数组(被输入的数组)去做标记📌就可以了.但是家人们注意,这里的标记咱要用障碍物来标记,也就是直接将数据改为障碍物
a[此行][此列]=障碍物(表示已走标记📌);
第三步 状态拓展
方法1
一般的状态拓展有两种:1.四个方位:上下左右;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y-1);
dfs(x,y+1)
2.八个方向:上下左右,右上右下,左上左下;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y-1);
dfs(x,y+1);
dfs(x+1,y-1);
dfs(x-1,y+1);
dfs(x-1,y-1);
dfs(x+1,y+1);
方法二
我们可以将坐标变化编成数组存起来,再使用循环于此行此列相加.这个方法在八位时使用,它的方便更突出.
int dx[5]={0,0,-1,1},dy[5]={1,-1,0,0}//记得行和列的数要相对应
for(i=1;i<=8或4;i++)
{
dfs(x+dx[i],y+dy[i]);
}
对了✅️家人们,你们记得在dfs前加void哦😮.
连通块问题的基本格式菲娜就讲完啦🌶️,拜拜👋!!!
有问题记得说哦😮!!!
GOODBEY┏(^0^)┛