题解 | #迷宫问题# 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})`) })