本文共 2611 字,大约阅读时间需要 8 分钟。
#include#include #include #include #include using namespace std;struct node { int x, y; int step; node(int x, int y, int step) : x(x), y(y), step(step) {}};bool operator>(node a, node b) { return a.step > b.step;}priority_queue , greater > q; bool bfs() { while (!q.empty()) { node cur = q.top(); q.pop(); if (map[cur.x][cur.y] == 'T') { cout << cur.step << endl; return true; } for (int i = 0; i < 4; ++i) { int xx = cur.x + dir[i][0]; int yy = cur.y + dir[i][1]; if (map[xx][yy] == 'B' || map[xx][yy] == 'R') continue; else { cout << cur.step + 1 << endl; true; } q.push(node(xx, yy, cur.step + 2)); } } return false; } int main() { while (cin >> n >> m && (n || m)) { for (int i = 1; i <= n; ++i) { cin >> map[i]; map[i][0] = map[i][m+1] = 'R'; for (int j = 1; j <= m; ++j) { if (map[i][j] == 'Y') { q.push(node(i, j, 0)); map[i][j] = 'R'; } } map[0][j] = map[n+1][j] = 'R'; } if (!bfs()) { cout << -1 << endl; } } }
#include#include #include #include #include #include #define N 900 #define INF 0x3f3f3f3f using namespace std; struct node { int to; int dist; node(int to, int dist) : to(to), dist(dist) {} }; vector g[N]; int vis[N], d[N]; char map[N][N]; int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; int ss, tt; int n, m; queue q; bool spfa() { q.push(ss); memset(vis, 0, sizeof(vis)); vis[ss] = 1; memset(d, 0x3f, sizeof(d)); d[ss] = 0; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; int len = g[u].size(); for (int i = 0; i < len; ++i) { int v = g[u][i].to; if (d[v] > d[u] + g[u][i].dist) { d[v] = d[u] + g[u][i].dist; if (!vis[v]) { q.push(v); vis[v] = 1; } } } } return d[tt] != INF; } int main() { while (cin >> n >> m && (n || m)) { for (int i = 0; i < n; ++i) { cin >> map[i]; for (int j = 0; j < m; ++j) { if (map[i][j] == 'R') ss = i * m + j; else if (map[i][j] == 'S') tt = i * m + j; else if (map[i][j] == 'B') { for (int k = 0; k < 4; ++k) { int x = i + dir[k][0]; int y = j + dir[k][1]; if (x < 0 || x >= n || y < 0 || y >= m) continue; if (map[x][y] == 'R' || map[x][y] == 'S') continue; int dist = 1; if (map[i][j] == 'B' && map[x][y] != 'B') dist = 2; if (map[i][j] == 'B' && map[x][y] == 'B') dist = 1; g[i * m + j].push_back(node(x * m + y, dist)); } } } } if (!spfa()) { cout << -1 << endl; } } }
这两段代码分别实现了BFS和SPFA算法,用于解决迷宫问题中的最短路径问题。BFS算法在处理权重为1的边时效率较高,而SPFA算法则更适合处理权重不一致的复杂图结构。通过优先队列管理节点的步数,确保每次处理的节点是当前已知的最优路径节点。代码中使用了优先队列和结构体来封装节点信息,保证了代码的清晰和可维护性。
转载地址:http://oghuz.baihongyu.com/