#include"queue"
#include"cstring"
using namespace std;
typedef pair<int,int> P;
int N,M;
char mz[105][105];
int mark[105][105];
int ans=0;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int BFS(int c,int l)
{
queue<P>que;
que.push(P(c,l));
while(!que.empty())
{
c=que.front().first,l=que.front().second;//Tmp=Queue.Top
if(mz[c][l]=='G')
return mark[c][l];//结束条件:找到终点
que.pop();
for(int i=0;i<4;i++)//状态扩展,列出下一层的所有可能状态
{
int x=c+dx[i];
int y=l+dy[i];
if(x<0||y<0||x>=N||y>=M)
continue;
if(!mark[x][y]&&mz[x][y]!='#')//状态合法,则生成新状态NEXT
{
mark[x][y]=mark[c][l]+1;//NEXT.STEP=Tmp.STEP+1
que.push(P(x,y));//加入队列
}
}
}
return -1;
}
int main()
{
memset(mark,0,sizeof(mark));
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
{
scanf("%s",mz[i]);
}
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
{
if(mz[i][j]=='S')
ans=BFS(i,j);
}
printf("%d\n",ans);
return 0;
}
问题描述:
给定一个大小为N*M的迷宫。迷宫由通道"."和墙壁“#”组成,起点为“S”,终点为“G”。每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。若无可行方案,输出-1。
限制条件:
N,M<=100
样例:
输入:
- 10 10
- #S######.#
- ......#..#
- .#.##.##.#
- .#........
- ##.##.####
- ....#....#
- .#######.#
- ....#.....
- .####.###.
- ....#...G#
输出:
- 22
输出:
- 22