[算法学习记录][星码StarryCoding][题解] P67 小e走迷宫

本题是一个典型的应用bfs求最短路径/时间的的题目,利用bfs很容易就能解决本题。
解题思路:

  1. 我们可以分别用三个数组来存储地图a[]、从起点到某点所需要的时间dit[],以及对是否走过某点vis[];
  2. 在一个矩阵当中,运用bfs时需要对某点的上下左右进行遍历,所以我们可以创建dx,dy两个数组,通过x+dx[i],y+dy[i]来实现遍历;
  3. 我们还需要判断当前的点是否仍在地图内,创建一个inmp函数来检查。

具体代码实现:

#include<iostream>
#include<queue>
using namespace std;
using ll = long long;
typedef pair<int, int> P2;
//定义一个pair,省的创建两个队列

const int N = 1e3 + 5;
int a[N][N], vis[N][N], dit[N][N], n, m;
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
//dx,dy是改变坐标用的数组分别代表上下左右
//a存储障碍物信息,vis存储点位是否到过的信息,dit存储时间,n,m是终点的坐标。
bool inmp(int x, int y)
{
	return x >= 1 && x <= n && y >= 1 && y <= m;
}
//检查坐标是否超出地图
void bfs(int sx, int sy)
{
	queue<P2> q;
	vis[sx][sy] = true;
	memset(dit, 0, sizeof dit);
	//每次调用都要把时间数组重置一下
	q.push({ sx,sy });
	//读入起点
	while (q.size())
	{
		int x = q.front().first;
		int y = q.front().second;
		//记录已遍历坐标,以便接下来对四周搜索未遍历点
		q.pop();
		//弹出已遍历坐标
		for (int i = 0; i < 4; i++)
		{
			int nx = x + dx[i], ny = y + dy[i];
			//移动坐标
			if (inmp(nx, ny) && !a[nx][ny] && !vis[nx][ny])
			{
				dit[nx][ny] = dit[x][y] + 1;
				//记录从该点到起点的时间
				q.push({ nx,ny });
				vis[nx][ny] = true;
			}
			//检查是否越界,是否有障碍物,是否走过
		}
		//遍历上下左右,寻找没走过的坐标
	}
	//bfs主函数(只要为完成遍历就继续进行,只要有一个点未被遍历,q.size()就不会是0)
}
//bfs寻找最短时间
void solve()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)cin >> a[i][j];
	}

	bfs(1, 1);
	if (vis[n][m])cout << dit[n][m] << "\n";
	else cout << -1 << "\n";
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int _ = 1;
	while (_--) solve();
	return 0;
}

本人初学算法,水平有限,如有纰漏,敬请指正

posted @ 2025-03-13 21:55  林克还是克林  阅读(119)  评论(0)    收藏  举报