布线问题解答

网格布线问题解决方案

问题描述

在一个 m x n 的网格中,从起点 “a” 到终点 “b” 寻找最短路径,并且遵循以下布线限制:

  1. 路径只能走垂直、水平或“日字”形(Z字形)
  2. 有些格子是锁定的,不能通过
  3. 已占用的路径格子不能被其他路径交叉

Python 代码实现

以下是一个基于广度优先搜索(BFS)算法的 Python 代码,用于满足该布线约束并计算最短路径。

from collections import deque

def shortest_path_with_zigzag(grid, start, end):
    rows, cols = len(grid), len(grid[0])
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 右、下、左、上
    queue = deque([(start[0], start[1], 0)])  # (行, 列, 距离)
    visited = set([(start[0], start[1])])

    while queue:
        x, y, dist = queue.popleft()

        # 如果到达终点,返回路径长度
        if (x, y) == end:
            return dist

        for dx, dy in directions:
            nx, ny = x + dx, y + dy

            # 检查边界并避免锁定的格子
            if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 0:
                if (nx, ny) not in visited:
                    visited.add((nx, ny))
                    queue.append((nx, ny, dist + 1))

            # 实现“日字”形布线:允许一个额外的Z字形移动
            for zx, zy in directions:
                zx_step, zy_step = nx + zx, ny + zy
                if (
                    0 <= zx_step < rows and 0 <= zy_step < cols 
                    and grid[zx_step][zy_step] == 0 and (zx_step, zy_step) not in visited
                ):
                    visited.add((zx_step, zy_step))
                    queue.append((zx_step, zy_step, dist + 2))  # Z字形移动增加一步

    return -1  # 无法找到路径

# 定义网格 (0 = 可通行, 1 = 锁定)
grid = [
    [0, 0, 0, 1, 0],
    [1, 1, 0, 1, 0],
    [0, 0, 0, 0, 0],
    [0, 1, 1, 0, 1],
    [0, 0, 0, 0, 0]
]

# 定义起点和终点
start = (0, 0)  # 起点 "a" 的位置
end = (4, 4)    # 终点 "b" 的位置

# 计算带“日字”形布线的最短路径
distance = shortest_path_with_zigzag(grid, start, end)
print("带日字形布线的最短路径长度:", distance)

代码说明

DIRECTIONS:定义了四个移动方向(上、下、左、右)。
is_valid:检查位置是否在网格内且未被阻挡。
find_shortest_path:主函数使用 BFS 搜索路径,确保满足 L 形转弯的限制。
起点和终点:start 和 end 分别表示 a 和 b 的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值