迷宫/经典BFS/不同走向表示方法/DFS与BFS的不同

首先这里补充一个知识,怎么把文本文档转换为二位列表:

首先将文档读取,file=open('xxx.txt','r')

接着将txt格式转换为字符串file=file.readlines()

得到的效果如图:

去掉字符串最后的换行标志file[i].replace('\n','')

然后换成多为列表即可

题解:

首先采用的是深度优先搜索,很明显深搜不适宜处理这样的题,计算机跑死也跑不出来大模型,只能拿例子来回忆一下深搜模板了:

深搜五部曲:

  1. 参数:return result路径列表,输入参数:grid地图,visited表示是否走过,起点坐标
  1. 结束递归条件:当走到终点的时候,结束递归,收集走过的方向
  1. 单层逻辑搜索: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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值