BFS 走出迷宫 我的第一道BFS

用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#
*/ 

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/82803551