03 用栈来解决迷宫问题(深度优先)
栈(Stack):一个数据集合,可以在集合一头进栈、出栈
栈的特点:先进后出(first-in last-out)
js实现栈的操作:
- let arr = [] ------ 表示栈
- arr.pop() ------ 出栈
- arr.push() ------ 进栈
<script>
let stack = []
for (let i=0; i<4; i++){
stack.push(i)
}
console.log(stack) //stack = [0,1,2,3]
console.log(stack.pop()) //3
console.log(stack) //stack = [0,1,2]
</script>
输出结果:
迷宫问题
<script>
// 用二维数组表示迷宫,1表示墙壁,0表示通路
let maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 1, 1, 1, 0, 1, 1, 0, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
let dirs = [
function(x,y){return [x-1,y]},
function(x,y){return [x,y+1]},
function(x,y){return [x+1,y]},
function(x,y){return [x,y-1]},
]
// 起点为(1,1) 终点为(8,8)
function maze_path(maze,x1=1,y1=1,x2=8,y2=8){
let path = [] //栈 存储从起点到终点的路径
path.push([x1,y1])//起点入栈
//栈不为空,则继续找元素0,并将其坐标入栈
//如果为空,则表明无法抵达终点,没有通路
while (path.length){
curNode = path[path.length-1] //栈顶元素
if(curNode[0] === x2 && curNode[1] == y2){
for (let j=0; j<path.length; j++){
console.log(path[j])
}
return true
}
let flag1 = false
for (let i=0; i<4; i++){
let nextNode = dirs[i](curNode[0],curNode[1])
if (maze[nextNode[0]][nextNode[1]] === 0){
path.push(nextNode)
maze[nextNode[0]][nextNode[1]] = 2
flag1 = true
break
}
}
// 四个方向找不到元素0,则将此元素出栈,回退到上一个元素
!flag1 ? path.pop() : flag1
}
return false
}
console.log(maze_path(maze))
</script>
用栈来解决迷宫问题,深度优先,但无法保证栈中的路径是最优解
如有疑问,或者有不足之处,欢迎在评论区下留言讨论