BFS广度搜索优先解决迷宫问题

该篇文章介绍了如何使用广度优先搜索(BFS)算法在一个给定的二维数组中,从起点(startx,starty)找到终点(p,q)的最短路径。通过定义结构体和队列实现路径探索。
摘要由CSDN通过智能技术生成

图片和代码来自b站BV16C4y1s7EF

#include <bits/stdc++.h>
using namespace std;
int a[100][100], v[100][100];

/*输入格式
5 4        (五行四列)
1 1 2 1    (第一行)
1 1 1 1    (第二行)
1 1 2 1    (第三行)
1 2 1 1    (第四行)
1 1 1 2    (第五行)
1 1 4 3    (起点坐标为1,1  终点坐标为 4,3)
*/
struct point {
	int x;
	int y;
	int step;
};// 定义结构体来记录点
queue<point> r;//申请队列

int dx[4] = {0, 1, 0, -1}; //四个方向右下左上
int dy[4] = {1, 0, -1, 0};
int main() {
	//输入阶段
	int n, m, startx, starty, p, q;
	//startx,starty为起点的横纵坐标 ,p q 为终点的横纵坐标
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
			scanf("%d", &a[i][j]);
		}
	scanf("%d%d%d%d", &startx, &starty, &p, &q);
	//BFS
	point start; // 定义一个起点
	start.x = startx;
	start.y = starty;
	start.step = 0;
	r.push(start);//将起点入队
	v[startx][starty] = 1; //设置为已经访问
	int flag = 0; //终点的标记
	while (!r.empty()) {//只要队列不为空就一直找
		int x = r.front().x;
		int y = r.front().y;
		if (x == p && y == q) {
			//如果找到终点了
			flag = 1; //将标记改为1
			printf("%d", r.front().step);
			break;
		}
		for (int k = 0; k <= 3; k++) {
			//四个方向试探,所以k从0到3
			int tx, ty;
			tx = x + dx[k];
			ty = y + dy[k];
			if (a[tx][ty] == 1 && v[tx][ty] == 0) {
				//如果这个地方是空地而且未访问
				//入队
				point temp;
				temp.x = tx;
				temp.y = ty;
				temp.step = r.front().step + 1;
				r.push(temp);
				v[tx][ty] = 1; // 设置为已经访问
			}
		}
		r.pop();// 把最开始的起点出队,从起点其他方向的点再次开始搜索
	}
	if (flag == 0) {
		printf("没有找到终点");
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您讲解C++使用广度优先搜索算法解决迷宫问题广度优先搜索算法是一种用于遍历或搜索树或图的算法,它从起点开始,逐层遍历每个可能的路径,直到找到目标节点或无法继续搜索为止。 在解决迷宫问题时,我们可以将迷宫看作一个图,其中每个格子都是一个节点,相邻的格子之间有一条边。我们可以使用广度优先搜索算法从起点开始遍历图,直到找到终点为止。在搜索过程中,我们需要记录每个节点的深度,并且每次遍历到一个节点时,都需要判断它是否是终点,如果是终点则搜索结束,否则继续向下搜索。 以下是C++代码示例: ```c++ #include <iostream> #include <queue> //使用STL库中的队列 #define ROW 5 #define COL 5 using namespace std; struct Node{ int x, y, depth; }; int maze[ROW][COL] = { {0, 0, 0, 0, 0}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 0}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 0} }; int visited[ROW][COL] = {0}; //记录节点是否被访问过 int dx[4] = {0, 0, 1, -1}; //定义四个方向的移动 int dy[4] = {1, -1, 0, 0}; void bfs(int x, int y){ queue<Node> q; //定义队列 Node start = {x, y, 0}; //起点节点 q.push(start); //将起点节点入队 visited[x][y] = 1; //标记起点节点已访问 while(!q.empty()){ //队列不为空时循环 Node cur = q.front(); //取出队首元素 q.pop(); //将队首元素出队 if(cur.x == ROW-1 && cur.y == COL-1){ //到达终点 cout << "Find the way! The shortest path length is " << cur.depth << endl; return; } for(int i=0; i<4; ++i){ //向四个方向进行搜索 int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(nx<0 || nx>=ROW || ny<0 || ny>=COL) continue; //越界跳过 if(visited[nx][ny] || maze[nx][ny]) continue; //已访问或者是墙跳过 visited[nx][ny] = 1; //标记为已访问 Node next = {nx, ny, cur.depth+1}; //将下一个节点入队 q.push(next); } } cout << "Can't find the way!" << endl; //无法到达终点 } int main(){ bfs(0, 0); //从起点开始搜索 return 0; } ``` 在上述代码中,我们使用广度优先搜索算法从起点开始遍历迷宫,并且使用visited数组记录节点是否被访问过。在搜索过程中,我们向四个方向进行搜索,直到找到终点或者无法继续搜索为止。如果找到了终点,则输出"Find the way! The shortest path length is xxx",其中xxx表示最短路径的长度,搜索结束。如果无法到达终点,则输出"Can't find the way!"。 希望这个例子可以帮助您理解C++使用广度优先搜索算法解决迷宫问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值