bfs两种记录路径方法

#include<cstdio>
#include<queue>
using namespace std;
struct sss
{
    int x,y;
}ans[6][6];
int map[6][6];
int flag[6][6];
int dec[4][2]={1,0,0,1,-1,0,0,-1};
void print(struct sss q)
{
    if(q.x==0&&q.y==0)
    {
        printf("(0, 0)
");
        return;
    }
    else
    {
        print(ans[q.x][q.y]);
        printf("(%d, %d)
",q.x,q.y);
    }
}
void bfs(int x,int y)
{
    struct sss q;
    queue<struct sss> s;
    flag[0][0]=1;
    q.x=x;
    q.y=y;
    s.push(q);
    ans[0][0].x=-1;
    ans[0][0].y=-1;
    while(!s.empty())
    {
        q=s.front();
        s.pop();
        if(q.x==4&&q.y==4)
        {
            print(q);
            return;
        }
        for(int i=0;i<4;i++)
        {
            int xx=dec[i][0]+q.x;
            int yy=dec[i][1]+q.y;
            if(xx>=0&&xx<5&&yy>=0&&yy<5&&flag[xx][yy]==0&&map[xx][yy]==0)
            {
                struct sss w;
                w.x=xx;
                w.y=yy;
                s.push(w);
                flag[xx][yy]=1;
                ans[xx][yy].x=q.x;
                ans[xx][yy].y=q.y;
            }
        }
    }
}
int main()
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    bfs(0,0);
}
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
char mp[1001][1001];
int n,m,k;
int flag;
int d[1001][1001];
char jg[1000001];
char yx[1000001];
int dis[4][2]={1,0,0,-1,0,1,-1,0};
char str[5]={"DLRU"};
void pan(int x,int y){
    //printf("k=%d
",k);
    int tmp=k;
    for(int i=0;i<k;i++){
        int dex=-1;
        for(int j=0;j<4;j++){
            pair<int,int> z;
            z.first=x+dis[j][0];
            z.second=y+dis[j][1];
            if(z.first>=0&&z.first<n&&z.second>=0&&z.second<m&&mp[z.first][z.second]!='*'&&d[z.first][z.second]<tmp){
                dex=j;
                break;
            }
        }
        tmp--;
        x=x+dis[dex][0];
        y=y+dis[dex][1];
        jg[i]=str[dex];
    }
    jg[k]='';
    printf("%s
",jg);
}
void bfs(int x,int y)
{
    queue<pair<int,int> > q;
    q.push(make_pair(x,y));
    for(int i=0;i<1000;i++){
        for(int j=0;j<1000;j++)
          d[i][j]=10000000;
    }
    int num=0;
    d[x][y]=0;
    while(!q.empty()){
        pair<int,int> w=q.front();
        q.pop();
        num++;
        for(int i=0;i<4;i++){
            pair<int,int> z;
            z.first=w.first+dis[i][0];
            z.second=w.second+dis[i][1];
            if(z.first>=0&&z.first<n&&z.second>=0&&z.second<m&&mp[z.first][z.second]=='.'){
                if(d[z.first][z.second]>d[w.first][w.second]+1){
                    d[z.first][z.second]=d[w.first][w.second]+1;
                    q.push(z);
                }
            }
        }
    }
    /*for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(d[i][j]==10000000) printf("%4d",-1);
            else printf("%4d",d[i][j]);
        }
        printf("
");
    }*/
//    printf("num=%d
",num);
    if(num==1) printf("IMPOSSIBLE");
    else pan(x,y);
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++){
        scanf("%s",mp[i]);
    }
    if(k%2){
        printf("IMPOSSIBLE");
        return 0;
    }
    int vis=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++)
        {
            if(mp[i][j]=='X')
            {
                mp[i][j]='.';
                bfs(i,j);
                vis=1;
                break;    
            }        
        }
        if(vis) break;
    }
}
原文地址:https://www.cnblogs.com/Lis-/p/10572619.html