![](https://i-blog.csdnimg.cn/blog_migrate/171d9ae6120bafb974360e620529a5b0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/20426ab5f57995023d80ab5b6040c412.png)
首先这里补充一个知识,怎么把文本文档转换为二位列表:
首先将文档读取,file=open('xxx.txt','r')
接着将txt格式转换为字符串file=file.readlines()
得到的效果如图:
![](https://i-blog.csdnimg.cn/blog_migrate/8ed026ab181971bf58a2ac77e4f99f0f.png)
去掉字符串最后的换行标志file[i].replace('\n','')
然后换成多为列表即可
题解:
首先采用的是深度优先搜索,很明显深搜不适宜处理这样的题,计算机跑死也跑不出来大模型,只能拿例子来回忆一下深搜模板了:
深搜五部曲:
参数:return result路径列表,输入参数:grid地图,visited表示是否走过,起点坐标
结束递归条件:当走到终点的时候,结束递归,收集走过的方向
单层逻辑搜索:for neighbor in node:
if neighbor不超过范围 and visited[当前点]==False and neighbor可以走
visited[node]=True
path.append(方向)
DFS(下一点的坐标,visited,grid)
visited[node]=False
path.pop()
于是我们给出代码:
file=open('迷宫1.txt','r')
file=file.readlines()
grid=[[]*6 for i in range(4)]
for i in range(4):
a=file[i].replace('\n','')
b=list(a)
s=[]
for j in range(len(b)):
s.append(int(b[j]))
grid[i]=s
class Solution:
def path(self,grid):
maxNum=0
visited=[[False]*6 for i in range(4)]
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j]==0:
maxNum+=1
maxNum-=2
result=[]
def DFS(x,y,num,path):
nonlocal visited,result
dire=[(1,0),(-1,0),(0,-1),(0,1)]
dic={}
dic[(1,0)]="D"
dic[(-1,0)]="U"
dic[(0,-1)]="L"
dic[(0,1)]="R"
if x==3 and y==5:
result.append(path[:])
for dir in dire:
if 0<=x+dir[0]<4 and 0<=y+dir[1]<6 and visited[x][y]==False and grid[x+dir[0]][y+dir[1]]!=1:
visited[x][y]=True
path.append(dic[dir])
DFS(x+dir[0],y+dir[1],num+1,path)
path.pop()
visited[x][y]=False
DFS(0,0,0,[])
return result
s=Solution()
result=s.path(grid)
res=[]
for i in range(len(result)):
temp=""
for j in range(len(result[i])):
temp+=result[i][j]
res.append(temp)
print(min(res,key=lambda x:len(x)))
下面是广搜模板:
from collections import deque#广搜通过队列完成
#graph是一个字典,表示图的邻接表
#start是起点
#visited存储已经访问过的点
def BFS(graph,visited,start):
queue=deque()#创建队列,储存已访问的节点
queue.append(start)#将起始节点加入队列
visited(start)=True#起始节点已访问
while queue:#当队列不为空时,循环执行此操作
node=queue.popleft()#弹出队首一个节点
处理node节点
for neighbor in graph[node]:依次遍历node相邻节点
if neighbor不超过地图范围 and visited[neighbor]==False and neighbor能走
queue.append(neighbor)
visited[neighbor]=True
换到迷宫此题中:
file=open('迷宫.txt','r')
file=file.readlines()
grid=[[]*50 for i in range(30)]
for i in range(30):
a=file[i].replace('\n','')
b=list(a)
s=[]
for j in range(len(b)):
s.append(int(b[j]))
grid[i]=s
from collections import deque
visited=[[False]*50 for i in range(30)]
result=[]
path=[]
def BFS(x,y,visited,grid):
dire=[(1,0),(0,-1),(0,1),(-1,0)]
dic={}
dic[(1,0)]="D"
dic[(-1,0)]="U"
dic[(0,-1)]="L"
dic[(0,1)]="R"
queue=deque()
queue.append((x,y,""))
visited[x][y]=True
while queue:
node=queue.popleft()
x,y,z=node[0],node[1],node[2]
for dir in dire:
if 0<=x+dir[0]<30 and 0<=y+dir[1]<50 and visited[x+dir[0]][y+dir[1]]==False and grid[x+dir[0]][y+dir[1]]!=1:
queue.append((x+dir[0],y+dir[1],z+dic[dir]))
visited[x+dir[0]][y+dir[1]]=True
if x==29 and y==49:
return z
print(BFS(0,0,visited,grid))