您的位置:首页 > 其它

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

2017-10-07 23:44 561 查看

迷宫的最短路径

给定一个大小为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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs ACM