mid-迷宫问题

给定一个二维数组表示的迷宫,寻找从起点到终点的最短有效路径并输出其长度和坐标路径。路径只能上下左右移动,0表示通路,1表示障碍。输入包含迷宫大小、障碍位置及起终点坐标,输出是最短路径长度和坐标序列。
摘要由CSDN通过智能技术生成

给定一个迷宫,给出起点和终点,找出从起点出发到终点的有效可行路径,并求出长度。迷宫可以用二维数组A来存储表示。0表示通路,1表示障碍。此处规定移动可以从上、下、左、右四个方向移动。坐标以行下标和列下标表示,均从0开始。迷宫可行路径可能有多条,且路径长度可能不一。输出路径长度最短路径。

输入描述:

第一行包含两个整数m与n,分别表示二维数组的行数、列数 第2~m+1行,每行包含n个数(0或1) 第m+2行包含两个整数表示起点的行下标和列下标 第m+3行包含两个整数表示终点的行下标和列下标

输出描述:

第一行输出从起点出发到终点的最短路径长度 第二行输出最短路径,路径以多个(x,y)坐标表示,每组坐标中间以空格分隔

输入样例:

5 5
0,0,0,0,0
0,1,0,1,0
0,1,1,0,0
0,1,1,0,1
0,0,0,0,0
0,0
4,4

输出样例: 

8
(0,0)(1,0)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4)

注:代码没有经过测试,只通过样例,如有问题请留言。

from collections import deque

def bfs(maze, start, end):
    m, n = len(maze), len(maze[0])
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右四个方向
    queue = deque([(start[0], start[1], [(start[0], start[1])])])  # 队列中存储当前坐标和路径
    visited = set()
    visited.add((start[0], start[1]))
    
    while queue:
        x, y, path = queue.popleft()
        
        if (x, y) == end:
            return len(path) - 1, path  # 返回路径长度和路径
        
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if 0 <= nx < m and 0 <= ny < n and maze[nx][ny] == 0 and (nx, ny) not in visited:
                queue.append((nx, ny, path + [(nx, ny)]))
                visited.add((nx, ny))
    
    return -1, []  # 如果没有路径,返回-1和空路径

def main():
    import sys
    input = sys.stdin.read
    data = input().strip().split('\n')
    
    m, n = map(int, data[0].split())
    maze = [list(map(int, row.split(','))) for row in data[1:m+1]]
    start = tuple(map(int, data[m+1].split(',')))
    end = tuple(map(int, data[m+2].split(',')))
    
    length, path = bfs(maze, start, end)
    
    if length == -1:
        print("没有可行路径")
    else:
        print(length)
        print(" ".join(f"({x}, {y})" for x, y in path))

if __name__ == "__main__":
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值