题目描述
给定一个大小为N*M的迷宫,由通道(’.’)和墙壁(’#’)组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)
样例输入:
10 10
样例输出:
22
详细题解请看代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#define INF 10000000
using namespace std;
typedef pair<int,int> P; //结构体状态,表示该点的坐标
int n,m;
int dp[105][105]; //表示起点到其他点的距离
char c[105][105]; //迷宫
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int sx,sy,gx,gy;
int bfs()
{
queue<P> que;//创建一个里面是结构体的队列
//所有的位置初始化为INF
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)dp[i][j]=INF;
//从起点开始寻找,所以将起点坐标添加到队列中
que.push(P(sx,sy));
//将该位置初始化为0
dp[sx][sy]=0;
while(que.size()){
//从队列的最前端去除元素
P p=que.front();
que.pop();
//如果取出的状态是终点,结束遍历
if(p.first==gx && p.second == gy)break;
//四个方向循环
for(int i=0;i<4;i++){
//移动之后的坐标nx,ny
int nx=p.first+dx[i],ny=p.second+dy[i];
//判断是否可以移动,以及是否访问过
if(nx>=0 && nx<n && ny>=0 && ny<m && c[nx][ny]!='#' && dp[nx][ny]==INF){
//如果可以访问的话,添加到队列中,并且到该位置的距离为到p的距离+1
que.push(P(nx,ny));
dp[nx][ny]=dp[p.first][p.second]+1;
}
}
}
return dp[gx][gy];
}
int main()
{
scanf("%d%d",&n,&m);
getchar(); //吸收换行符
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&c[i][j]);
if(c[i][j]=='S'){ //记录起始点
sx=i;
sy=j;
}
if(c[i][j]=='G'){ //记录终点
gx=i;
gy=j;
}
}
getchar(); //吸收换行符
}
int res=bfs();
printf("%d\n",res);
return 0;
}