印刷电路板将布线区域划分成n×m个方格。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,为了避免线路相交,已布了线的方格做封锁标记,其它线路不允穿过被封锁的方格。求最短线路的布线方案。C++实现
时间: 2024-02-11 20:07:33 浏览: 88
这是一个典型的最短路径问题,可以使用 Dijkstra 算法或 A* 算法解决。以下是使用 Dijkstra 算法求解的 C++ 实现:
```c++
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 105;
const int INF = 0x3f3f3f3f;
int n, m;
int sx, sy, tx, ty; // 起点和终点坐标
int graph[MAXN][MAXN]; // 图的邻接矩阵
int dis[MAXN][MAXN]; // 起点到每个点的最短距离
bool vis[MAXN][MAXN]; // 该点是否已被访问过
struct Node {
int x, y, dis;
bool operator < (const Node& other) const {
return dis > other.dis; // 优先队列使用大根堆
}
};
bool isInBound(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= m;
}
void dijkstra() {
memset(dis, INF, sizeof(dis));
memset(vis, false, sizeof(vis));
priority_queue<Node> q;
q.push({sx, sy, 0});
dis[sx][sy] = 0;
while (!q.empty()) {
Node cur = q.top();
q.pop();
if (vis[cur.x][cur.y]) continue;
vis[cur.x][cur.y] = true;
// 更新周围节点的最短距离
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (i == 0 && j == 0) continue; // 自身不算
if (i != 0 && j != 0) continue; // 只能直线或直角布线
int nx = cur.x + i, ny = cur.y + j;
if (!isInBound(nx, ny)) continue; // 超出边界
if (graph[nx][ny] == 1) continue; // 被封锁
int ndis = cur.dis + abs(i) + abs(j);
if (ndis < dis[nx][ny]) {
dis[nx][ny] = ndis;
q.push({nx, ny, ndis});
}
}
}
}
}
int main() {
cin >> n >> m;
cin >> sx >> sy >> tx >> ty;
// 读入图的邻接矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> graph[i][j];
}
}
dijkstra();
cout << dis[tx][ty] << endl;
return 0;
}
```
其中,`isInBound` 函数用于判断该点是否超出边界,`dijkstra` 函数用于求解最短路径,`Node` 结构体用于存储节点的坐标和起点到该点的最短距离。
阅读全文