小白书之迷宫最短路径bfs

来源:互联网 发布:人工智能三大定律 编辑:程序博客网 时间:2024/05/22 03:34

vis标记,以免更改了值和路径,

同时打印路径时用递归同样会有溢出的危险,改成非递归即可。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#define LL __int64using namespace std;const int maxn=1001;int maze[maxn][maxn],vis[maxn][maxn];int fa[maxn][maxn],dist[maxn][maxn],last_dir[maxn][maxn];char name[4]={'U','L','R','D'};int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};int n,m;void bfs(int x,int y){    queue<int> q;    int u=x*m+y;    vis[x][y]=1;    fa[x][y]=u;    dist[x][y]=0;    q.push(u);    while(!q.empty())    {       // cout<<q.size()<<endl;        u=q.front();      //  cout<<u<<endl;        q.pop();      //  cout<<q.size()<<endl;        int cx=u/m,cy=u%m;        for(int i=0;i<4;i++)        {            int nx=dx[i]+cx;            int ny=dy[i]+cy;            if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]&&!vis[nx][ny])            {               // cout<<"GG"<<endl;                int v=nx*m+ny;                vis[nx][ny]=1;                fa[nx][ny]=u;                dist[nx][ny]=dist[cx][cy]+1;                last_dir[nx][ny]=i;                q.push(v);            }        }    }}/*void print_path(int x,int y){    int fx=fa[x][y]/m;    int fy=fa[x][y]%m;    if(fx!=x||fy!=y)    {        print_path(fx,fy);        putchar(name[last_dir[x][y]]);    }}*/int dir[maxn*maxn];void print_path(int x,int y){    int c=0;    for(;;)    {       int fx=fa[x][y]/m;       int fy=fa[x][y]%m;       if(fx==x&&fy==y) break;       dir[c++]=last_dir[x][y];       x=fx;       y=fy;    }    while(c--)    {        putchar(name[dir[c]]);    }}int main(){    while(cin>>n)    {        memset(vis,0,sizeof(vis));        cin>>m;        for(int i=0;i<n;i++)        {            string s;            cin>>s;            for(int j=0;j<m;j++)                maze[i][j]=s[j]-'0';        }        bfs(0,0);        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)        {            print_path(i,j);            cout<<endl;            cout<<dist[i][j]<<endl;        }    }    return 0;}


0 0
原创粉丝点击