POJ 3984

POJ 3984

BFS求最短路 + 路径输出

路径输出的方法

只需要用另外一个数组记录每个点的前驱是谁就行,因为BFS会产生多个后继,但最短路上的点只有唯一的前驱

最后递归输出即可

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
const int N = 10;
int g[N][N];
#define endl '\n'
struct node {
    int x,y;
};
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
bool vis[N][N];
queue<node> q;
node ans[N][N];
void bfs() {
    q.push({0,0});
    vis[0][0] = 1;
    ans[0][0] = {-1,-1};
    while(q.size()) {
        node t = q.front();
        if(t.x == 4 && t.y == 4) return ;
        q.pop();
        for(int i = 0;i < 4; ++i) {
            int nx = dx[i] + t.x;
            int ny = dy[i] + t.y;
            if(g[nx][ny] == 0 && nx >= 0 && nx < 5 && ny >= 0 && ny < 5 && !vis[nx][ny]) {
                q.push({nx,ny});
                vis[nx][ny] = 1;
                ans[nx][ny].x = t.x;
                ans[nx][ny].y = t.y;
            }
        }
    }
}
void print(int x,int y) {
    if(x == 0 && y == 0) {
        printf("(%d, %d)\n",0,0);
        return ;
    }
    print(ans[x][y].x,ans[x][y].y);
    printf("(%d, %d)\n",x,y);
}
int main() {
    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    for(int i = 0;i < 5; ++i)
        for(int j = 0;j < 5; ++j) 
            cin >> g[i][j];
    bfs();
    print(4,4);
    return 0;
}
posted @ 2020-03-05 13:41  南风--  阅读(128)  评论(0编辑  收藏  举报