设为首页 加入收藏

TOP

迷宫问题
2017-11-07 08:56:48 】 浏览:64
Tags:迷宫 问题

问题

用一个二维数组表示一个简单的迷宫,用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)]
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇生成器、装饰器、迭代器 下一篇Django学习案例一(blog):五.Ad..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目