迷宫的最短路径
给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以
向邻接的上下左右四个方位的通道移动,请求出从起点到终点所需的最小不熟。
此题假设一定能从起点到终点
限制条件:
N,M <=100
样例:
输入:
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出:
22
#include<iostream>
#include<queue>
#include<utility>
using namespace std;
int N,M;
int sx,sy;//起点
int gx,gy;//终点
#define MAX_N 101
#define INF 1000000
char maze[MAX_N][MAX_N];//迷宫
typedef pair<int,int> p;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
queue<p> q;
int d[MAX_N][MAX_N];
int bfs()
{
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
d[i][j]=INF;
}
}
int nx,ny;
q.push(p(sx,sy));
d[sx][sy]=0;
cout<<gx<<" "<<gy<<endl;
cout<<sx<<" "<<sy<<endl;
while(q.size())
{
p P=q.front();q.pop();
if(P.first==gx&&P.second==gy) {cout<<P.first<<" "<<P.second<<endl; break;}
for(int i=0;i<4;i++)
{
nx=P.first+dir[i][0];
ny=P.second+dir[i][1];
if(0<=nx&&nx<N&&0<=ny&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF)
{
q.push(p(nx,ny));
d[nx][ny]=d[P.first][P.second]+1;
}
}
}
return d[gx][gy];
}
int main()
{
while(cin>>N>>M)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
cin>>maze[i][j];
if(maze[i][j]=='S'){sx=i;sy=j;}
if(maze[i][j]=='G'){gx=i;gy=j;}
}
}
cout<<bfs()<<endl;
}
}