首页 > 其他 > 详细

BFS输出路径

时间:2020-11-21 10:41:46      阅读:47      评论:0      收藏:0      [点我收藏+]
#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>8||yy>8) 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);
} 

 

#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>8||yy>8) 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);} 

BFS输出路径

原文:https://www.cnblogs.com/lipu123/p/14013687.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!