题目
二维数组,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));
记录记录!