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

来源:互联网 发布:微课录制软件下载 编辑:程序博客网 时间:2024/05/21 10:00

迷宫的最短路径

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

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

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

//简单BFS#include<cstdio>#include<iostream>#include<cstring>#include<queue>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;    queue<node>q;    q.push(p);    vis[sx][sy]=1;    while(!q.empty())    {    node tmp=q.front();        q.pop();        if(tmp.x==ex&&tmp.y==ey)            {cout<<"最短路为"<<tmp.step<<endl;                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();    }}