矩阵中广度优先搜索的使用

题目信息

这道题是leetCode中的542题-01矩阵,
题目大意是给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 
输入
    [0 0 0]
    [0 1 0]
    [0 0 0]
输出
    [0 0 0]
    [0 1 0]
    [0 0 0]

输入
    [0 0 0]
    [0 1 0]
    [1 1 1]
输出
    [0 0 0]
    [0 1 0]
    [1 2 1]
注意:
    给定矩阵的元素个数不超过 10000。
    给定矩阵中至少有一个元素是 0。
    矩阵中的元素只在四个方向上相邻: 上、下、左、右

解题思路

这道题是典型的可以使用BFS去解决的,首页遍历数组将所有非0的赋值为-1,遍历的同时将为0的坐标保存到数组中。遍历之前保存0的数组的上下左右,在当前为0坐标的数据上加1,并且保存到数组中

代码

class matrixSolution {
    func matrix(_ matrix: [[Int]]) -> [[Int]] {
        var tempMatrix = matrix;
        var stack: [[Int]] = [];
        let rowNumber = matrix.count;
        let lineNumber = matrix[0].count;
        
        // 遍历备份的数组,将所有不为0的赋值为-1,将为0的坐标保存到另外一个数组
        for (i, list) in matrix.enumerated() {
            for (j, item) in list.enumerated() {
                if (item == 0) {
                    stack.append([i, j]);
                } else {
                    tempMatrix[i][j] = -1;
                }
            }
        }
        
        // 这两个数组用于取值上下左右遍历
        let bx = [-1, 1, 0, 0];
        let by = [0, 0, -1, 1];
        
        // 遍历stack队列 知道为空时为止
        while !stack.isEmpty {
            let point = stack.first;
            stack.removeFirst();
            let x = point![0];
            let y = point![1];
            
            // 向周围四个方向遍历
            for ibx in 0..<4 {
                let newX = x + bx[ibx];
                let newY = y + by[ibx];
                if newX >= 0 && newX < rowNumber && newY >= 0 && newY < lineNumber && tempMatrix[newX][newY] == -1 {
                    tempMatrix[newX][newY] = tempMatrix[x][y] + 1;
                    stack.append([newX, newY]);
                }
            }
            
        }
        return tempMatrix;
    }
}

题目链接


posted @ 2020-04-17 15:14  木子沉雨  阅读(283)  评论(0编辑  收藏  举报