广度优先搜索遍历(BFS)在二维数组上的应用例题讲解

广度优先搜索遍历又名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 &&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值