迷宫的最短路线(BFS)

本文介绍了使用BFS算法解决迷宫中寻找从起点到终点最短路径的问题。在限制条件n, m<100的情况下,通过初始化迷宫状态、设置起点坐标并进行广度优先搜索,逐步探索符合条件的相邻位置,直到找到终点。最后返回终点距离。代码中涉及到了队列、typedef和pair的应用。" 111551066,10297059,解决react应用中引入react-thunk报错问题,"['前端开发', 'React', 'Redux', 'Middleware']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迷宫的最短路线(BFS)

题目:给定一个大小为n*m的迷宫。迷宫由通道和墙壁足证,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需要的最小步数。请注意,本体假定从起点一定可以移动到终点。

限制条件:n,m<100

思路:

1.初始化迷宫maze[i][j],并对其每一个位置附上一个很大的值来表示状态d[i][j](有没有走过)。

2.取起点坐标将其加入队列que

3.用while循环体

1)取出队首元素,并将其出队(如果是终点,那直接break)

2)用for循环来遍历上下左右4个方向,找出符合条件的坐标,并把到该位置的距离确定到p的距离+1(不超出迷宫范围,该坐标还不是终点坐标,该坐标还没有走过)

4.return d[gx][gy]

代码:

<span style="font-size:18px;">#include <iostream>
#include <queue>
using namespace std;
const int inf=100000000;
const int max_n=100,max_m=100;
int n,m;
int sx,sy;//起点坐标
int gx,gy;//终点坐标
char maze[max_n][max_m+1];//表示迷宫的字符串的数组
int d[max_n][max_m];//到各个位置的最短距离的数组
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//4个方向移动的向量
typedef pair<int,int> P; //使用pair表示状态时,使用typedef会更加方便一些
void solve();
int bfsn();
int main()
{
	cin>>n>>m;
	//初始化迷宫,并记录起点和终点的坐标
	for (int i=0;i<n;i++)
		for (int j=0;j<m;j++)
		{
			cin>>maze[i][j];
			if (maze[i][j]=='S') {sx=i;sy=j;}
			else if (maze[i][j]=='G') {gx=i;gy=j;}
		}
	solve();
	return 0;
}

void solve()
{
	int res=bfsn();
	cout<<"最短路径是:"<<res<<endl;
}

//求从(sx,sy)到(gx,gy)的最短距离
//如果无法到达,则是inf
int bfsn()
{
	queue<P> que;
	//把所有位置都初始化为inf
	for (int i=0;i<n;i++)
		for (int j=0;j<m;j++)
			d[i][j]=inf;
	//将起点加入队列,并把这一地点的距离设置为0
	que.push(P(sx,sy));
	d[sx][sy]=0;
	
	//不断循环直到队列长度为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];
			int ny=p.second+dy[i];
			if (0<=nx && nx<=n && 0<=ny && ny<=m && maze[nx][ny]!='#' && d[nx][ny]==inf)
			{
				//可以移动的话,则加入到队列,并且到该位置的距离确定为到p的距离+1
				que.push(P(nx,ny));//入队
				d[nx][ny]=d[p.first][p.second]+1;
			}
		}
	}
	return d[gx][gy];
}</span>

本题应用了BFS(广度优先搜索),队列,还应用了typedef,pair

关于typedef和pair,之后再说明



### BFS算法用于求解迷宫短路径 广度优先搜索(BFS)是一种逐层遍历图结构的方式,在处理无权图中的短路径问题时非常有效[^1]。对于迷宫而言,可以将其视为一个二维数组表示的网格地图,其中0代表可通过的位置而1则代表障碍物。 下面是一个使用C语言实现基于队列的BFS来查找从起点到终点短路径的例子: ```c #include <stdio.h> #define MAX 100 int queue[MAX * MAX], front = -1, rear = -1; int visited[MAX][MAX]; char maze[MAX][MAX]; typedef struct { int x, y; } Point; // 判断位置是否合法 int isValid(int row, int col, int rows, int cols) { return (row >= 0 && row < rows && col >= 0 && col < cols); } void enqueue(Point p) { if(rear == MAX*MAX-1){ printf("Queue is full\n"); return; } queue[++rear]=p.x*p.cols+p.y; // 将坐标转换成一维索引存储 } Point dequeue() { Point temp={queue[front]/cols, queue[front]%cols}; ++front; return temp; } int isEmpty(){ return front>rear; } void bfs(char maze[][MAX], int startRow, int startCol, int endRow, int endCol, int rows, int cols) { Point src = {startRow, startCol}, dest = {endRow, endCol}; // 初始化访问标记矩阵 for (int i=0;i<rows;++i) for (int j=0;j<cols;++j) visited[i][j]=0; enqueue(src); while (!isEmpty()) { Point current = dequeue(); if(current.x==dest.x&&current.y==dest.y){ printf("Found the exit at (%d,%d)\n", dest.x, dest.y); break; } // 上下左右四个方向移动尝试 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; for (int k = 0; k < 4; ++k) { int newRow=current.x+dx[k], newCol=current.y+dy[k]; if(isValid(newRow,newCol,rows,cols)&&!visited[newRow][newCol]&&maze[newRow][newCol]!='1'){ visited[newRow][newCol]=visited[current.x][current.y]+1; Point nextPos={newRow, newCol}; enqueue(nextPos); } } } } ``` 此代码片段展示了如何利用队列数据结构执行标准形式下的宽度优先搜索过程,并记录到达每个节点所需的步数以便终确定短距离。注意这里假设输入的是字符型迷宫布局('0'为空白,'1'为墙壁),并且已经预定义好了大尺寸`MAX`以及行列数目等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值