python求迷宫最短路径

python求迷宫最短路径算法-bfs

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 27 13:48:14 2021

@author: Administrator
"""

###无递归、类求迷宫最短路径算法
#import random
pre_route=list()    #宽度搜索得到的节点
q=list()    #队列结构控制循环次数
xx=[0,1,0,-1]   #右移、下移、左移、上移
yy=[1,0,-1,0]
visited=list()  #记录节点是否已遍历
father=list()   #每一个pre_route节点的父节点
route=list()
def bfs(l,x,y,m,n):
    visited=[[0 for i in range(len(l[0]))]for j in range(len(l))]
    visited[x][y]=1 #入口节点设置为已遍历
    q.append([x,y])
    while q:    #队列为空则结束循环
        now=q[0]
        q.pop(0)    #移除队列头结点
        for i in range(4):
            point=[now[0]+xx[i],now[1]+yy[i]]   #当前节点
            if point[0]<0 or point[1]<0 or point[0]>=len(l) or point[1]>=len(l[0]) or visited[point[0]][point[1]]==1 or l[point[0]][point[1]]=='1':
                continue
            father.append(now)
            visited[point[0]][point[1]]=1
            q.append(point)
            pre_route.append(point)
            if point[0]==m and point[1]==n:
                print("success")
                return 1
    print("false")
    return 0

def get_route(father,pre_route):    #输出最短迷宫路径
    route=[pre_route[-1],father[-1]]
    for i in range(len(pre_route)-1,-1,-1):
        if pre_route[i]==route[-1]:
            route.append(father[i])
    route.reverse()
    print("迷宫最短路径为:\n",route)
    print("步长:",len(route)-1)
    return route
    
def prn_map(route,l,m,n):   #打印包含路径的迷宫图
    for i in range(len(l)):
        l[i]=list(l[i])
    for i in range(len(route)):
        l[route[i][0]][route[i][1]]='2'
    for i in range(len(l)):
        for j in range(len(l[0])):
            if l[i][j]=='1':
                print('  ',end='')
            elif l[i][j]=='0':
                print('██',end='')
            else:
                print('░░',end='')
            if i==m and j==n:
                print('☀',end='')
        print()

l=['01010101001011001001010110010110100100001000101010',
   '00001000100000101010010000100000001001100110100101',
   '01111011010010001000001101001011100011000000010000',
   '01000000001010100011010000101000001010101011001011',
   '00011111000000101000010010100010100000101100000000',
   '11001000110101000010101100011010011010101011110111',
   '00011011010101001001001010000001000101001110000000',
   '10100000101000100110101010111110011000010000111010',
   '00111000001010100001100010000001000101001100001001',
   '11000110100001110010001001010101010101010001101000',
   '00010000100100000101001010101110100010101010000101',
   '11100100101001001000010000010101010100100100010100',
   '00000010000000101011001111010001100000101010100011',
   '10101010011100001000011000010110011110110100001000',
   '10101010100001101010100101000010100000111011101001',
   '10000000101100010000101100101101001011100000000100',
   '10101001000000010100100001000100000100011110101001',
   '00101001010101101001010100011010101101110000110101',
   '11001010000100001100000010100101000001000111000010',
   '00001000110000110101101000000100101001001000011101',
   '10100101000101000000001110110010110101101010100001',
   '00101000010000110101010000100010001001000100010101',
   '10100001000110010001000010101001010101011111010010',
   '00000100101000000110010100101001000001000000000010',
   '11010000001001110111001001000011101001011011101000',
   '00000110100010001000100000001000011101000000110011',
   '10101000101000100010001111100010101001010000001000',
   '10000010100101001010110000000100101010001011101000',
   '00111100001000010000000110111000000001000000001011',
   '10000001100111010111010001000110111010101101111000']

if __name__ =='__main__':
    x=0;y=0
    m=25;n=40
    if bfs(l,x,y,m,n)==1:
        route=get_route(father,pre_route)
        prn_map(route,l,m,n)

在这里插入图片描述
直观效果图

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值