BFS(带回溯路径) 典例 代码

来源:互联网 发布:lambda表达式java 编辑:程序博客网 时间:2024/06/03 21:23

BFS经典例题:

题目大意:给定一个点图,然后输出S到T的最短路径。

样例输入:

          /*
          5 6
          ###T#*
          S#****
          *##*##
          ******
          *#*#*#
          */

样例输出:

          (1,0)->(2,0)->(3,0)->(3,1)->(3,2)->(3,3)->(2,3)->(1,3)->(0,3)


AC代码如下:

#include<cstdio>#include<queue>#include<cstring>using namespace std;  //如果没有这个,报错:'queue' does not name a type!const int N=100;char graph[N][N];int prex[N][N];int prey[N][N];int n,m;int sx,sy,tx,ty;queue <int> qx;queue <int> qy;int dirx[]={0,0,1,-1};int diry[]={1,-1,0,0};bool vis[N][N];bool check(int x,int y){    return (x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&(graph[x][y]=='*'||graph[x][y]=='T'));//注意不要把'T'这个目的地给滤掉}void bfs(){    qx.push(sx);    qy.push(sy);    while(!qx.empty())    {        int x=qx.front();        int y=qy.front();        qx.pop();        qy.pop();        for(int i=0;i<4;i++)        {            int nx=x+dirx[i];            int ny=y+diry[i];            if(check(nx,ny))            {                vis[nx][ny]=1;                prex[nx][ny]=x;                prey[nx][ny]=y;                if(graph[nx][ny]=='T')                {                    return;                }                else                {                    qx.push(nx);                    qy.push(ny);                }            }        }    }}void show(int x,int y){    if(x==-1)        return ;    show(prex[x][y],prey[x][y]);    printf("(%d,%d)->",x,y);}int main(){    memset(prex,-1,sizeof(prex));    memset(prey,-1,sizeof(prey));    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)    {        scanf("%s",graph[i]);        for(int j=0;j<m;j++)        {            if(graph[i][j]=='S')            {                sx=i;                sy=j;            }            else if(graph[i][j]=='T')            {                tx=i;                ty=j;            }        }    }    bfs();    show(prex[tx][ty],prey[tx][ty]);    printf("(%d,%d)\n",tx,ty);    return 0;}



原创粉丝点击