用S表示出发点,用.表示可以走的点,用G表示最后的终点,用#表示墙,不能通过。计算出能不走出迷宫,如果能走出迷宫,就计算出最短路径。
用队列的思想来实现BFS
***用一个dis[][]二维数组在dis[x][y]处专门存储起点到(x,y)的距离。
***先将起点push进队列,然后将此处的dis[][]设置为0,然后进入循环。得到队列的第一个元素front,判断front是不是终点,是终点就返回。不是终点的话,就探索周围的点,并将可以走的点(是可以走的路,并且还没有走过),加入到队列的末尾。加入的点的在dis[][]里面对应的更新距离(距离就是上一个点的dis[][]+1)。如此循环,最终当读到末尾的点,退出循环。或者是que.size()为0,此时没有可走的点,表示走不出迷宫,退出循环。
收获:
1:方向的移动,可以使用一个4*2的数组来控制!
2:在dis[][]初始化的时候,可以将里面初始化成一个特定的数。
3:queue的使用:
①:queue<pair> p; <>里面默认的是deque
②:p.front(); p.pop(); p.push(); p.back(); p.empty()
***没有清空队列的函数
4:pair的使用:
①:pair<int,int> pair<>里面有两个参数
扫描二维码关注公众号,回复:
3281788 查看本文章
②:传pair进队列 que.push(pair(1,2));
③:可以通过first second来访问里面的元素
直接贴代码:
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int> P;
#define max_x 100
#define max_y 100
const int INF=10000;
char bg[max_x][max_y];
int dis[max_x][max_y];
int S_x,S_y,E_x,E_y;
int N,M;
int dir[4][2]={ {1,0},{0,1},{-1,0},{0,-1} };
int bfs()
{
//先初始化,将所有的距离变成INF
int i,j;
for(i=1;i<=N;i++){
for(j=1;j<=M;j++){
dis[i][j]=INF;
}
}
queue<P> que;
que.push(P(S_x,S_y));
dis[S_x][S_y]=0;
while(que.size())
{
P temp=que.front();
que.pop();
if(temp.first==E_x && temp.second==E_y)
return dis[temp.first][temp.second];
for(i=0;i<4;i++){
int nx=dir[i][0]+temp.first,ny=dir[i][1]+temp.second;
if(1<=nx && nx<=N && 1<=ny && ny<=M && '#'!=bg[nx][ny] && INF==dis[nx][ny]){//找到点后,如果是可以走的点,并且还没有进过栈区
que.push(P(nx,ny));
dis[nx][ny]=dis[temp.first][temp.second]+1;
}
}
}
return INF;//表示的是走不到这个点
}
void slove()
{
int res=bfs();
if(INF==res){
printf("没有出路!");
}else{
printf("%d",res);
}
}
int main()
{
int i,j;
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++){
getchar();
for(j=1;j<=M;j++){
scanf("%c",&bg[i][j]);
}
}
for(i=1;i<=N;i++){
for(j=1;j<=M;j++){
if('S'==bg[i][j]){
S_x=i,S_y=j;
}
if('G'==bg[i][j]){
E_x=i,E_y=j;
}
}
}
slove();
return 0;
}
/*
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
*/