某跳动面试官:写一道迷宫问题叭。

322 阅读1分钟

题目

二维数组,1表示墙,2表示起点,3表示终点,问起点到终点最少走几步
111111111
102000111
100101111 
110000311
111111111

思路

最常见的迷宫问题辣。无疑两种方法,dfs、bfs。但笔者深度优先写的多鸭。唉,看来bfs也要常练鸭。

使用dfs+回溯。

代码

//DFS + 回溯
let foo = (arr, a, b, m, n) => {
    function dfs(arr, i, j, step) {
        if (i < 0 || i > arr.length - 1 || j < 0 || j > arr[0].length - 1 || arr[i][j] === 1) {
            return;
        }
        if (i === m && j === n) {
            res = res > step ? step : res
        }

        arr[i][j] = 1;
        dfs(arr, i + 1, j, step + 1)
        dfs(arr, i - 1, j, step + 1)
        dfs(arr, i, j - 1, step + 1)
        dfs(arr, i, j + 1, step + 1)
        //回溯
        arr[i][j] = 0;
    }

    let res = Infinity;
    dfs(arr, a, b, 1)
    return res;
}

//测试
let arr =
    [
        [1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 0, 2, 0, 0, 0, 0, 0, 1],
        [1, 0, 1, 1, 1, 1, 1, 0, 1],
        [1, 1, 0, 0, 0, 0, 3, 0, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1]
    ]

console.log(foo(arr, 1, 2, 3, 6));


记录记录!