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

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读取的迷宫矩阵,就没这个问题了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • lazyn 2022-06-30 21:50
    关注

    需要先进行一个数据类型的准换,因为puzzle为float型,无法按照索引赋值为‘*’,代码如下,

    puzzle_str = puzzle.astype('str')
    for i, j in res:
        puzzle_str[i][j] = '*'
        puzzle[i][j] = 100
    print(puzzle_str)
    print(puzzle)
    

    建议按照索引赋值为较大的值,如100,两种赋值的结果如下图

    img

    评论
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 OpenFOAM多孔介质传热模型建模
  • ¥15 QT 实现 RSTP 语音对讲功能
  • ¥50 AES魔改之后的安全性关于PRF(相关搜索:密码学)
  • ¥15 用C语言写的一个程序遇到了两个问题第一是偏移正确但读取不到坐标,第二个问题是自己定义的函数实现不了获取指定进程模块。
  • ¥15 在安装Anaconda时总是闪退怎么办?
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥500 抖音主页视频预存加载卡bug