zoukankan      html  css  js  c++  java
  • 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);
    } 

    博客

  • 相关阅读:
    iOS UI控件7(UITableView)
    iOS UI控件6
    iOS UI控件5-UIPickerView
    iOS UI控件4
    iOS UI控件(3)
    iOS UI控件(2) UITextView
    iOS UI控件(1)
    C# 解决上位机串口接收数据丢失问题
    C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
    如何将Debug文件夹下的资源打包成一个EXE文件直接执行
  • 原文地址:https://www.cnblogs.com/lipu123/p/14013687.html
Copyright © 2011-2022 走看看