03 用栈来解决迷宫问题(深度优先)

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>

用栈来解决迷宫问题,深度优先,但无法保证栈中的路径是最优解
如有疑问,或者有不足之处,欢迎在评论区下留言讨论

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值