BFS与DFS的区别应用 来解决leetcode 被围绕区域问题

这篇博客详细介绍了深度优先搜索(DFS)和广度优先搜索(BFS)的基本概念,并通过一个具体的二维矩阵问题展示了它们的实现。问题中,从边界开始标记'O'为'#',同时将被包围的'O'也标记为'#'。DFS通过递归回溯的方式进行,而BFS则利用队列进行齐头并进的遍历。最终,两种方法都能完成任务,但策略不同。
摘要由CSDN通过智能技术生成

DFS与BFS 解释: BFS 齐头并进利用队列; DFS 则是递归回溯后续遍历



let board = [["O", "O", "O", "X"], ["O", "X", "X", "X"], ["X", "O", "O", "X"], ["X", "X", "X", "O"]]

let rowsL = board.length, colsL = board[0].length;

function solve(board) {
    if (!board.length) return;
    let arr = []
    for (let i = 0; i < rowsL; ++i) {
        //左右
        if (board[i][0] == 'O') { arr.push([i, 0]) }
        if (board[i][colsL - 1] == 'O') {
            arr.push([i, colsL - 1])
        }
    }
    for (let i = 0; i < colsL; ++i) {
        // 上下
        if (board[0][i] == 'O') { arr.push([0, i]) }
        if (board[rowsL - 1][i] == 'O') { arr.push([rowsL - 1, i]) }
    }

    for (let index = 0; index < arr.length; index++) {
        dfs(arr[index]) //或bfs(arr[index])
    }
    for (let i = 0; i < rowsL; ++i) {
        for (let j = 0; j < colsL; ++j) {
            if (board[i][j] == 'O') board[i][j] = 'X';
            if (board[i][j] == '#') board[i][j] = 'O';
        }
    }
}

solve(board)

function dfs(arrIndex) {
    const row = arrIndex[0], col = arrIndex[1]
    if (row < 0 || row == rowsL || col < 0 || col == colsL || board[row][col] != 'O') return;
    board[row][col] = '#';
    dfs([row + 1, col]);
    dfs([row - 1, col]);
    dfs([row, col + 1]);
    dfs([row, col - 1]);
}

function bfs(arrIndex) {
    let q = [arrIndex]
    while (q.length) {
        const qIndex = q.shift()
        const row = qIndex[0], col = qIndex[1]
        if (row < 0 || row == rowsL || col < 0 || col == colsL || board[row][col] != 'O') continue;
        board[row][col] = '#';
        q.push([row + 1, col])
        q.push([row - 1, col])
        q.push([row, col + 1])
        q.push([row, col - 1])

    }

}
console.log(board);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值