理解广度优先搜索的走迷宫问题

最近在更新一些自己学的知识点
这次轮到bfs了

首先就要提到bfs和dfs的区别,dfs其实就是在搜索一棵树,之所以叫深度优先,就是说dfs会优先向下搜索,在搜索完一个结点后,它会优先去搜索这个结点的儿子结点。而bfs在此时则会优先搜索它的兄弟结点,所以我们会说bfs是按层搜索的算法

走迷宫

题目描述
给定一个n*m的二维字符数组,用来表示一个迷宫,数组中只包含’#‘或’.’,其中’.‘表示可以走的路,’#'表示不可通过的墙壁。
最初,有一个人位于起点S处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至终点T处,至少需要移动多少次。

输入格式
第一行包含两个整数n和m。
接下来n行,每行包含m个字符,表示完整的二维字符数组迷宫。

输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。

bfs通常用队列来实现
看题目我们可以得到,当走到点 ‘T’ 的时候就到了终点
所以当前点的横纵坐标与终点 ‘T’ 的坐标相同时,结束bfs
我们只需要每次去遍历这个点可以走的四个方向
判断每个方向是否可以走,并把新的状态入队列即可

char mat[1005][1005];
struct Node{
	int x,y,step;
};
int dx[] = {-1,1,0,0} , dy[] = {0,0,-1,1};
int vis[1001][1001],n,m; //代表走过的位置 

int bfs(int x,int y){
	Node st;
	st.x = x , st.y = y;
	st.step = 0;
	queue<Node>que;
	que.push(st);
	while(!que.empty()){
		Node now = que.front(); que.pop();// 拿出队首元素 出队列
		if(mat[now.x][now.y] == 'T'){
			return now.step;
		}
		for(int i=0;i<4;i++){
			int x = now.x + dx[i] , y = now.y + dy[i];
			if(vis[x][y] == 0 && x>=1 && x<=n && y>=1 && y<=m && mat[x][y] != '#'){
				Node tmp; tmp.x = x; tmp.y = y; tmp.step = now.step + 1;
				vis[x][y] = 1;
				que.push(tmp);
			}
		}
	}
	return -1;
}

int main(){
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",mat[i]+1);
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(mat[i][j] == 'S'){
				int ans = bfs(i,j);
				if(ans == -1){
					printf("没有找到迷宫终点!\n");
				}else{	
					printf("最短的路径长度为:%d\n",ans);
				}
				return 0;
			}
		}
	}
   	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你数过天上的星星吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值