题目描述:
有一张 m*n 的地图,地图描述了起点和终点的位置,也描述了两点间分布的高山湖泊,高山湖泊挡住去路,需要绕道行走,请问从起点到终点的最短路径距离是多少?
注意: 走动路线只能上下左右,不能斜着走。
解法:回溯法
js版本:
var findRoute = function(start, end, grid) {
let m = grid.length, n = grid[0].length;
if(m === 1 && n === 1) return;
let visited = new Array(m).fill(0).map(() => new Array(n).fill(0));
let res = [];
let choice = [[-1, 0],[1, 0],[0, 1],[0, -1]];
const dfs = (cur, visited, step) => {
let [x, y] = cur;
if(grid[x][y] === 1) return;
if(x === end[0] && y === end[1]){
res.push(step);
return;
}
for(let item of choice){
let dx = x + item[0], dy = y + item[1];
if(dx < m && dx >= 0 && dy >= 0 && dy < n){
if(visited[dx][dy] === 1) continue;
visited[dx][dy] = 1;
dfs([dx, dy], visited, step+1);
visited[dx][dy] = 0;
}
}
}
dfs(start, visited, 0);
res.sort((a, b) => a - b);
return res[0];
}
python3版本:
def demo(self, grid, start, end):
'''
按图找最近的路
'''
m, n = len(grid), len(grid[0])
if m == 1 and n == 1:
return 0
visited = [[0 for _ in range(m)] for _ in range(n)]
result = []
def bfs(current, visited, step):
'''
回溯
current:当前的坐标
visited:记录已访问的数组
step:从起点到当前坐标所用的步数
'''
x, y = current
if grid[x][y] == 1:
return
if x == end[0] and y == end[1]:
result.append(step)
return
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n:
if visited[nx][ny] == 1:
continue
visited[nx][ny] = 1
bfs((nx, ny), visited, step+1)
visited[nx][ny] = 0
bfs(start, visited, 0)
result.sort()
return result[0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)