lingzixi 2022-06-30 20:12 采纳率: 78.6%
浏览 183
已结题

python走迷宫深度优先搜索

有哦人知道这个程序要怎么改成打印出来的迷宫路径使用星号表示的吗,就是矩阵里面能显示路径

img


```python
from numpy import *
def findpath(puzzle, start, end):
    # 四个方向
    d = [(-1,0),(0,1),(1,0),(0,-1)]
    vis = [[-1 for _ in range(len(puzzle[0]))] for _ in range(len(puzzle))]
    #迷宫矩阵,0表示路, 1表示墙 
    vis[start[0]][start[1]]=start
    dfs = [start]     
    while dfs:
        x,y = dfs.pop()    #取栈顶及其探查方向
        for i in range(4): #依次检查未探查方向
            m = x+d[i][0]
            n = y+d[i][1]  #算出下一位
            puzzle[start[0]][start[1]] = 6 #把走过的记录为6
            if 0<=m<len(puzzle) and 0<=n<len(puzzle[0]) and puzzle[m][n]==0 and vis[m][n]==-1:   #遇到未探查的新位置 
                dfs.append((x,y))    #原位置和下一方向入栈
                dfs.append((m,n))
                vis[m][n]=(x,y)      #新位置入栈
                puzzle[start[0]][start[1]] = 6 #把走过的记录为6
                if end==(m,n): #到达出口,打印路径
                    return dfs
                break   #退出内层循环,下次迭代将以新栈顶为当前位置继续
    return dfs  #找不到路径
    
puzzle = zeros((10, 10), dtype=float) # 先创建一个全零方阵puzzle;,并且数据的类型设置为float浮点型
f = open('test2.txt') # 打开数据文件文件
lines = f.readlines() # 把全部数据文件读到一个列表lines中
puzzle_row = 0  # 表示矩阵的行,从0行开始
for line in lines: # 把lines中的数据逐行读取出
         list = line.strip('\n').split(' ') # 处理逐行数据:strip表示把头尾的'\n'去掉,split表示以空格来分割行数据,然后把处理后的行数据返回到list列表中
         puzzle[puzzle_row:] = list[0:10] # 把处理后的数据放到方阵A中。list[0:4]表示列表的0,1,2,3列数据放到矩阵A中的A_row行
         puzzle_row += 1 # 然后方阵A的下一行接着读
print(puzzle)        
start = eval(input("请输入起始坐标(x,y):"))
end = eval(input("请输入终点坐标(m,n):"))
res = findpath(puzzle, start, end)
if res:print(res)
else: print('无路可走')


```

  • 写回答

2条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-06-30 21:17
    关注

    额。。。注释得挺好
    把输出结果里的坐标数字替换成星号就好了

    for i, j in res:
        puzzle[i][j] = "*"
    

    如果要保存进txt,还要把之前的迷宫数字都换成字符串,当然,如果你是从txt读取的迷宫矩阵,就没这个问题了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月8日
  • 已采纳回答 6月30日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同