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

本文共 2611 字,大约阅读时间需要 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 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/

你可能感兴趣的文章
Objective-C实现perfect number完全数算法(附完整源码)
查看>>
Objective-C实现perfect square完全平方数算法(附完整源码)
查看>>
Objective-C实现permutate Without Repetitions无重复排列算法(附完整源码)
查看>>
Objective-C实现PNG图片格式转换BMP图片格式(附完整源码)
查看>>
Objective-C实现pollard rho大数分解算法(附完整源码)
查看>>
Objective-C实现Polynomials多项式算法 (附完整源码)
查看>>
Objective-C实现power iteration幂迭代算法(附完整源码)
查看>>
Objective-C实现powLinear函数和powFaster函数算法 (附完整源码)
查看>>
Objective-C实现PrimeFactors质因子分解算法 (附完整源码)
查看>>
Objective-C实现pythagoras哥拉斯算法(附完整源码)
查看>>
Objective-C实现qubit measure量子位测量算法(附完整源码)
查看>>
Objective-C实现quick select快速选择算法(附完整源码)
查看>>
Objective-C实现radians弧度制算法(附完整源码)
查看>>
Objective-C实现radianToDegree弧度到度算法(附完整源码)
查看>>
Objective-C实现radix sort基数排序算法(附完整源码)
查看>>
Objective-C实现rayleigh quotient瑞利商算法(附完整源码)
查看>>
Objective-C实现RC4加解密算法(附完整源码)
查看>>
Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
查看>>
Objective-C实现recursive insertion sort递归插入排序算法(附完整源码)
查看>>
Objective-C实现RedBlackTree红黑树算法(附完整源码)
查看>>