利用广度优先遍历搜索迷宫的python源代码

广度优先遍历简称为DFS,是数据结构中比较常用的一个算法,主要原理是采用队列先进先出的规则,一层一层的访问图的节点。而迷宫问题接近与遍历,但是不同于遍历,主要考虑是采用栈的形式标记路径,并对当前节点和死胡同分别标记为2和3,对死胡同的节点弹出栈,这样循环最终会找到一个路径。当然,存在一个问题就是不一定是最优的路径。

'''
Title:广度优先遍历探索迷宫
Date: 2018-04-18
Author:Jackie
Commont:
    1、使用栈stack保存路径
    2、采用广度优先遍历,将当前节点(栈的顶点)可用的临近节点全部压栈,并标记为2
    3、对于发现死胡同时,将当前节点弹出栈,并标记为3
    4、不需要使用队列,因为队列主要实现遍历,而不是最优化
'''

from collections import deque

matrix = [
    [0, 1, 0, 0, 1],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 1, 0]
]

# dfs function
def dfs_fun(matrix, start, end):
    stack = []
    stack.append(start)
    x, y = start
    matrix[x][y] =2
    forward = True
    while stack:
        pos = stack[-1]
        if pos == end:
            print("Had find last path")
            return stack
        xPos, yPos = pos
        forward = False
        if yPos+1 < len(matrix):
            if matrix[xPos][yPos+1] ==0:
                stack.append((xPos, yPos+1))
                matrix[xPos][yPos+1] =2
                forward = True
        if xPos+1 < len(matrix) :
            if matrix[xPos+1][yPos] ==0:
                stack.append((xPos+1, yPos))
                matrix[xPos+1][yPos] =2
                forward = True
        if xPos-1 >=0 :
            if matrix[xPos-1][yPos] ==0:
                stack.append((xPos-1, yPos))
                matrix[xPos-1][yPos] =2
                forward = True
        if yPos-1>=0:
            if matrix[xPos][yPos-1] ==0:
                stack.append((xPos, yPos-1))
                matrix[xPos][yPos-1] =2
                forward = True
        # bad road
        if not forward:
            x, y = stack.pop()
            matrix[xPos][yPos] = 3
    return False


if __name__ == '__main__':
    result = dfs_fun(matrix, (0,0), (4,4))
    print(result)


转载于:https://www.cnblogs.com/feiyuntaoist/p/8872235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值