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

全部评论
强啊
点赞 回复 分享
发布于 2022-11-17 17:53 广东

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务