广度优先搜索遍历又名BFS,属于盲目搜寻法,是图的搜索算法之一,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。下面列出几道经典例题,来带领大家一同求解。
(1)给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。
本题意思是求解数组中每个数到数字0的距离,0自己本身的距离为0,且距离只考虑上下左右四个方向,不考虑左上,左下,右上,右下等方向。由于题目求各个点到0的距离,我们可以将0这个点入队列,然后从0这个点向上下左右四个方向扩散,并且标记是否访问过,可以直接修改原数组的值来进行标记,每个点都入队一次,下面贴出代码,注释也如下:
class Solution {
public:
vector < vector < int > >updateMatrix(vector< vector< int > > & mat) {
//定义上下左右四个方向的坐标,来方便结点进行移动访问
int dirs[4][2] = { {0,1}, {0,-1}, {1,0}, {-1,0}};
//数组的行数和列数
int m = mat.size(), n = mat[0].size();
//定义结果数组,分别将其中元素初始值都设置为0
vector < vector < int > >res(m,vector<int>(n));
//队列
queue< pair< int,int > > q;
//遍历数组中的每个元素
for(int i = 0;i < m;i++)
{
for(int j = 0;j < n;j++)
{
//将数组元素为0的加入到队列中
if(mat[i][j] == 0)
{
q.push( {i,j} );
}
}
}
//当队列不为空时
while(!q.empty())
{
//分别取出队头结点的坐标值
int x = q.front().first,y = q.front().second;
//队头出队
q.pop();
//分别寻找刚取出头结点的上下左右四个方向看是否有值为1的结点
for(int i = 0;i < 4;i++)
{
int nx = x + dirs[i][0],ny = y + dirs[i][1];
//如果坐标取值合理并且找到的值为1且结果数组未曾访问过
if(nx >= 0 && nx < m && ny>= 0 && ny <n &&