• 迷宫问题


    问题

    用一个二维数组表示一个简单的迷宫,用0表示通路,用1表示阻断,
    老鼠在每个点上可以移动到相邻的东南西北四个点,设计一个算法,
    模拟老鼠走迷宫,找到入口到出口的一条路径

    例如:

        1,1,1,1,1,1,1
    入口-> 0,0,1,0,1,1
        1,1,0,0,0,1,1
        1,0,0,1,1,0,1
        1,0,1,0,0,0,1
        1,0,0,0,1,0 ->出口
        1,1,1,1,1,1,1
    

    算法:
    1.用一个栈来记录老鼠从入口到出口的路径.
    2.走到某点后,将该点坐标压栈,并把该点值置为1,表示走过了.
    3.从临近的四个点中可到达的点中任意选取一个,走到该点.
    4.如果在到达某点后邻近的4个点都不能走,说明已经走入死胡同.
    此时退栈,退后一步尝试其它点.
    5.反复执行(2),(3),(4)直到找到出口.(空栈代表没有出口)

    Python代码示例

    初始化迷宫

    def initMaze():
        '''
        初始化迷宫
        :return:
        '''
    
        # 构造7*7的二维数组
        maze = [[0] * 7 for  _ in xrange(5 + 2)]
    
        # 迷宫内部的墙
        walls = [
            (1, 3),
            (2, 1), (2, 5),
            (3, 3), (3, 4),
            (4, 2), #(4, 3), 没有路径
            (5, 4),
        ]
    
        # 四周为1
        for i in xrange(5 + 2):
            maze[i][0] = maze[i][-1] = 1
            maze[0][i] = maze[-1][i] = 1
    
        # 设置墙为1
        for i, j in walls:
            maze[i][j] = 1
    
        return  maze
    

    路径算法

    def path(maze, start, end):
        '''
        路径
        :param maze:迷宫
        :param start: 入口
        :param end: 出口
        :return:
        '''
        i, j = start
        ei, ej = end
    
        # 当前在入口,且走过,置为1
        s = [(i, j)]
        maze[i][j] = 1
    
        while s:
            # 栈顶表示当前的点
            i, j = s[-1]
            # 找到出口
            if(i, j)== (ei, ej):
                break
    
            # 从临近的4个点探测
            for di, dj in [(0, -1), (0, 1), (-1, 0), (1, 0)]:
                # i + di,j + dj 下一个点
                if maze[i + di][j + dj] == 0:
                    # 压栈,并置为1
                    maze[i + di][j + dj] = 1
                    s.append((i + di, j + dj))
                    break
            else:
                # 遇到死胡同
                s.pop()
    
        return s
    

    执行函数

    maze = initMaze()
    print path(maze, (1, 1), (5, 5))
    

    结果

    [(1, 1), (1, 2), (2, 2), (3, 2), (3, 1), (4, 1), (5, 1), (5, 2), (5, 3), (4, 3), (4, 4), (4, 5), (5, 5)]
    
  • 相关阅读:
    Vue
    数组去重、数组中的对象去重
    Vue 拖拽组件 vuedraggable 、 vue-dragging 、awe-dnd
    如何衡量一个人的 JavaScript 水平?
    八个免费的Vue图标库
    vue中使用animate.css实现动画
    web本地存储(localStorage、sessionStorage)
    vue引入iconfont报错
    RESTful API 最佳实践
    mysql 用户管理和权限设置
  • 原文地址:https://www.cnblogs.com/Py00/p/7788396.html
Copyright © 2020-2023  润新知