• 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);
    } 

    博客

  • 相关阅读:
    WPF Image控件的Source属性是一个ImageSource对象
    wx:if 与hidden
    切换远程分支
    异步请求(简单一说)
    多维数组降维方法,简单一提
    3.25发版之最后的搜索框
    wepy-城市按字母排序
    new一个新对象。。。对象???
    参数函数是对象的理解
    群辉 MariaDB 10 远程连接
  • 原文地址:https://www.cnblogs.com/lipu123/p/14013687.html
Copyright © 2020-2023  润新知