最简单的BFS入门题目——迷宫的最短路径

迷宫的最短路径

给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。如果不能到达,输出“不能走到那里”。(N,M<=50,起点,终点分别用S,G表示)

输入样例:N=5,M=5
#S###
..##.
#.###
..###
..G## 
输出:5

分析:这是一道BFS模版题,直接要求最短路,没有其他的约束条件
以下是代码

//简单BFS
#include
#include
#include
#include
using namespace std;
char maze[50][50];
bool vis[10][10];
int n,m;
int sx,sy;
int ex,ey;
int dx[]={1,0,-1,0};//四个方向
int dy[]={0,1,0,-1};
struct node
{
    int x,y,step;
};
void bfs()
{
    node p;
    p.x=sx;p.y=sy;p.step=0;
    queueq;
    q.push(p);
    vis[sx][sy]=1;
    while(!q.empty())
    {    node tmp=q.front();
        q.pop();
        if(tmp.x==ex&&tmp.y==ey)
            {cout<<"最短路为"<return;}
        for(int i=0;i<4;i++)
        {int xx=tmp.x+dx[i];
        int yy=tmp.y+dy[i];
        if(maze[xx][yy]!='#'&&xx>0&&yy>0&&xx<=n&&yy<=m&&!vis[xx][yy])
        {
            node tp;
            tp.x=xx;
            tp.y=yy;
            tp.step=tmp.step+1;
            vis[xx][yy]=1;
            q.push(tp);
        }

        }
    }
    cout << "不能走到那里!" << endl;
}


int main()
{
    while(~scanf("%d%d",&n,&m)&&n!=0&&m!=0)
    {   memset(vis,0,sizeof(vis));//给标记数组清零
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {cin>>maze[i][j];
          if(maze[i][j]=='S')
                {sx=i;sy=j;}
            if(maze[i][j]=='G')
            {ex=i;ey=j;}


    }   bfs();
    }
}

你可能感兴趣的:(杂题)