走迷宫(BFS模板题,需背)

题目描述
给定一个 N x M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1表示,障碍物用 0表示)
已知迷宫的入口位置为(x1,y),出口位置为(x2,y2)。问从入口走到出口,最少要走多少个格子。


输入描述
输入第 1行包含两个正整数 N,M,分别表示迷宫的大小。
接下来输入一个 N xM 的矩阵。若 G(i,j)=1表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。

1 <= N,M <= 10**2 , 0 <= G(i,j) <= 1 , 1<= x1,x2 < N , 1 <= y1,y2 < M

输出描述
输出仅一行,包含一个整数表示答案。
若无法从入口到出口,则输出 一1。

输入示例

5 5

1 0 1 1 0

1 1 0 1 1

0 1 0 1 1

1 1 1 1 1

1 0 0 0 1

1 1 5 5

输出示例

 8

代码 

from collections import deque

#1.接收输入
n,m = map(int,input().split())
#接受迷宫数值
maze = [[] * (m+1) for _ in range(n+1)]
for i in range(1,n+1):
    maze[i] = [0] + list(map(int,input().split()))
x1,y1,x2,y2 = map(int,input().split())



#2.广度优先搜索
def bfs():
    #2.1创建所需变量
    q = deque()
    q.append((x1,y1,0))     #纳入队列的点,步数
    visited = set()
    dic = [(0,1),(0,-1),(1,0),(-1,0)]
    
    #2.2判断队列是否为空
    while q:
        #遍历队列
        for _ in range(len(q)):
            x,y,step = q.popleft()
            if x == x2 and y == y2:
                return step
            if (x,y) in visited:
                continue
            visited.add((x,y))  #否则加入该点
            for c in dic:
                nx,ny = x+c[0], y+c[1]  
                if 1<=nx<=n and 1<=ny<=m and maze[nx][ny] == 1 :
                    q.append((nx,ny,step+1))
    return -1   #如果所有可能都没找到出口

print(bfs())

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值