BFS输出路径

#include<iostream>
#include<algorithm>
#include<queue> 
using namespace std;
typedef long long ll;
const int maxn=1e3+100;
int vis[maxn][maxn];
char a[maxn][maxn];
int b[maxn][maxn];
struct node{
    int x;
    int y;
};
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m,sx,sy,ex,ey;
int ans=0;
int bfs(int x,int y){
    queue<node>q;
    node no,nx;
    no.x=x;
    no.y=y;
    q.push(no);
    vis[x][y]=1; 
    b[x][y]=1;
    int f;
    while(!q.empty()){
        no=q.front();
        q.pop();
        int x1=no.x;
        int y1=no.y;
        if(x1==ex&&y1==ey)//若走到了
        {
            f=1;
            node road[1110];//用来记录路径 
            int k=1;
            while(!(x1==sx&&y1==sy))//通过b数组来找到之前是哪一个点走到x,y的
            {
                road[k].x=x1;
                road[k++].y=y1;
                for(int i=0;i<4;i++)
                {
                    int xx=x1+dx[i];
                    int yy=y1+dy[i];
                    if(xx<1||yy<1||xx>n||yy>m) continue;//超出范围的不要
                    if(b[xx][yy]==b[x1][y1]-1)
                    {
                        x1=xx;//倒退回去
                        y1=yy;
                        break;//一定要跳出,要把更新的x,y放到road里
                    }
                }
            }
            road[k].x=sx;//别忘了把起点放进去
            road[k].y=sy;
            for(int i=k;i>=1;i--)//输出路径
            {
                cout<<road[i].x<<" "<<road[i].y<<endl; 
            }
        }
        if(f){
            break;
        }
        for(int i=0;i<4;i++){
            nx.x=no.x+dx[i];
            nx.y=no.y+dy[i];
            if(nx.x<=0||nx.y<=0||nx.x>n||nx.y>m||a[nx.x][nx.y]=='1'||vis[nx.x][nx.y]==1)continue;
            vis[nx.x][nx.y]=1;
            b[nx.x][nx.y]=b[no.x][no.y]+1; 
            q.push(nx);
        } 
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        } 
    }
    cin>>sx>>sy>>ex>>ey;
    int t=bfs(sx,sy);
} 

 

博客

posted @ 2020-11-21 00:34  哎呦哎(iui)  阅读(206)  评论(0编辑  收藏  举报