博客
关于我
POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
阅读量:432 次
发布时间:2019-03-06

本文共 2583 字,大约阅读时间需要 8 分钟。

BFS算法实现

#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; } }}

SPFA算法实现

#include 
#include
#include
#include
#include
#include
#define N 900#define INF 0x3f3f3f3fusing 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/

你可能感兴趣的文章
OSPF 学习
查看>>
OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
查看>>
OSPF 概念型问题
查看>>
OSPF 的主要目的是什么?
查看>>
OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
查看>>
SQL Server 存储过程分页。
查看>>
OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
查看>>
OSPF不能发现其他区域路由时,该怎么办?
查看>>
OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
查看>>
SQL Server 存储过程
查看>>
OSPF在什么情况下会进行Router ID的重新选取?
查看>>
OSPF在大型网络中的应用:高效路由与可扩展性
查看>>
OSPF太难了,这份OSPF综合实验请每位网络工程师查收,周末弯道超车!
查看>>
OSPF技术入门(第三十四课)
查看>>
OSPF技术连载10:OSPF 缺省路由
查看>>
OSPF技术连载11:OSPF 8种 LSA 类型,6000字总结!
查看>>
OSPF技术连载12:OSPF LSA泛洪——维护网络拓扑的关键
查看>>
OSPF技术连载13:OSPF Hello 间隔和 Dead 间隔
查看>>
OSPF技术连载14:OSPF路由器唯一标识符——Router ID
查看>>
OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
查看>>