蓝桥杯备考:BFS最短路径之Meteor Shower S流星雨

发布于:2025-03-24 ⋅ 阅读:(46) ⋅ 点赞:(0)

本题是一个BFS最短路问题,我们可以先把时刻的矩阵搞出来,哪些时刻哪些方块儿不能走用来剪枝

如果第一次走到永远不会被扎到的区域,那时候就是我们的最短距离

定义方向向量

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
const int N = 450,INF = 0x3f3f3f3f;
int t[N][N];
int dist[N][N];//记录距离 
int dx[] = {0,-1,0,1};
int dy[] = {-1,0,1,0};
int bfs()
{
	memset(dist,INF,sizeof dist);
	queue<PII> q;
	q.push({0,0});
	dist[0][0] = 0;
	if(t[0][0] == INF) return 0; 
	while(q.size())
	{
		
		auto p = q.front();q.pop();
		int fx = p.first,fy = p.second;
		for(int i = 0;i<4;i++)
		{
			int x = fx+dx[i],y=fy+dy[i];
			if(x<0 || y<0) continue;
			if(t[x][y] <= dist[fx][fy]+1)continue;
			if(dist[x][y] != INF) continue;
			if(t[x][y] == INF) return dist[fx][fy]+1;
			dist[x][y] = dist[fx][fy]+1;
			q.push({x,y});
		}
	}
	return -1;
}
int main()
{
	int m;cin >> m;
	memset(t,INF,sizeof(t));
	for(int i = 1;i<=m;i++)
	{
		int x,y,z;cin >> x >> y >> z;
		t[x][y] = min(t[x][y],z);
		for(int i = 0;i<4;i++)
		{
			int px = x+dx[i];
			int py = y+dy[i];
			if(px<0 || py <0) continue;
			t[px][py] = min(t[px][py],z);
		}
	}//定义时刻矩阵
	//接下来我们该bfs本矩阵了
	cout << bfs() << endl;
	 
	
	
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到