题解 | #迷宫问题# JavaScript 解法
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
const [X, Y] = readline().split(' ').map(x => parseInt(x))
// 使用队列来实现 bfs,将下一步所有可能到达的位置都加入到队列中,完成之后出队当前元素
// 再将下一个坐标所有可能到达的位置入队,即可
const map = []
while(line = readline()) {
map.push(line.split(' ').map(x => parseInt(x)))
}
// 起点为 (0, 0)
// 创建队列并将起点坐标加入到队首
const queue = [[0, 0]]
// 将所到达的点的父节点记录下来
const reachedPointMap = new Map()
// 将第一个结点加入进去
reachedPointMap.set(`0,0`, `0,0`)
// 如果当前坐标符合要求,则将其放入队列中
const reachPoint = ([cx, cy], [fx, fy]) => {
// 要检查的内容有
// 1. 是否是数组边界
// 2. 是否是墙壁
// 3. 是否已到达过
// 维护一个集合,当一个点满足条件时,将该点以字符串形式加入到集合中,此后每次需要
// 判断是否已到达过该点,只需在集合中查找是否存在该点的字符串形式即可
if (cx >= map.length || cx < 0 || cy >= map[0].length || cy < 0 || map[cx][cy] !== 0 || reachedPointMap.has(`${cx},${cy}`)) {
return
}
// 若该点满足条件则将其加入到队列
queue.push([cx, cy])
reachedPointMap.set(`${cx},${cy}`, `${fx},${fy}`)
}
while (queue.length > 0) {
// 将当前队首元素出队
// 查看当前队首元素的下一个可到达的点,将其加入到队尾
// 取得队首点坐标,
const [curx, cury] = queue.shift()
// 判断是否为终点,是终点则break
if (curx + 1 === X && cury + 1 === Y) {
break
}
// 不是终点:
// 将该点接下来可到达的位置加入到队列中 顺序为右下左上
// 依次找到对应的坐标,调用reachPoint函数
// 继续循环
else {
reachPoint([curx + 1, cury], [curx, cury])
reachPoint([curx, cury + 1], [curx, cury])
reachPoint([curx - 1, cury], [curx, cury])
reachPoint([curx, cury - 1], [curx, cury])
}
}
let tmpx = X - 1, tmpy = Y - 1
const pathStack = [[tmpx, tmpy]]
// 当没有到达起点时,寻找当前点的父节点入栈,找到起点时结束
while (tmpx !== '0' || tmpy !== '0') {
const [fx, fy] = reachedPointMap.get(`${tmpx},${tmpy}`).split(',')
pathStack.unshift([fx, fy])
tmpx = fx, tmpy = fy
}
pathStack.forEach(([x, y]) => {
console.log(`(${x},${y})`)
})

查看21道真题和解析