给定一个大小为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;
queue 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<<"最短路为"<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();
}
}