可以用两种方式输出路径,一个正向(需要借助栈),一个是反向;
BFS正向打印路径:
#include <iostream> #include <cstring> #include <queue> #include <stack> #define x first #define y second using namespace std; const int N = 1010; typedef pair<int,int>PII; int g[N][N]; PII pre[N][N]; queue<PII> q; int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}; int n; void bfs(int sx, int sy) { memset(pre, -1, sizeof pre); pre[sx][sy] = {N, N}; q.push({sx, sy}); while(q.size()) { auto t = q.front(); q.pop(); int xx = t.x, yy = t.y; for(int i = 0; i < 4; i++) { int x = dx[i] + xx, y = dy[i] + yy; if(!g[x][y] && x >= 0 && x < n && y >= 0 && y < n && pre[x][y].y == -1) { pre[x][y] = t; q.push({x,y}); } } } } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf("%d", &g[i][j]); bfs(0,0); int x = n - 1, y = n - 1; stack<PII>s; while(x || y) { s.push({x,y}); auto t = pre[x][y]; x = t.x, y = t.y; } s.push({0,0}); while(s.size()) { auto t = s.top(); s.pop(); printf("%d %d\n", t.x, t.y); } return 0; }
BFS逆向打印路径:(我吐了,输入图的时候忘记加&了,找了半天)
#include <iostream> #include <queue> #include <cstring> #define x first #define y second using namespace std; typedef pair<int,int>PII; const int N = 1010; int g[N][N]; PII pre[N][N]; queue<PII>q; int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}; int n; void bfs(int sx, int sy) { memset(pre, -1, sizeof pre); pre[sx][sy] = {n,n}; q.push({sx, sy}); while(q.size()) { auto t = q.front(); q.pop(); int xx = t.x, yy = t.y; for(int i = 0; i < 4; i++) { int x = xx + dx[i], y = yy + dy[i]; if(!g[x][y] && x >= 0 && x < n && y >= 0 && y < n && pre[x][y].y == -1) { pre[x][y] = t; q.push({x,y}); } } } } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf("%d", &g[i][j]); bfs(n-1, n-1); int x = 0, y = 0; while(x != n || y != n) { printf("%d %d\n", x, y); auto t = pre[x][y]; x = t.x, y = t.y; } return 0; }