搜索>>P2895 [USACO08FEB] Meteor Shower S

P2895 [USACO08FEB] Meteor Shower S 链接此处

一句话题意

在非负网格(x>=0,y>=0)中,有m颗流星在\(t_i\)时刻坠落,会烧毁坠落的那一格以及上下左右4格,问主角从(0,0)移动到安全格需要多少时间?不可能则输出-1.

关键

这道题与马的行走那道题一样,都需要正确使用偏移量数组,可大大简化程序

for(int i=0;i<4;i++)
{
	int nx=u.x+dx[i];
	int ny=u.y+dy[i];
	//......
}

不过还有一个边界问题:在非负网格中,横纵坐标可以无限延伸,x>301,y>=301的情况是许可并且安全的

while(q.size())
	{
		auto u=q.front();q.pop();
		
//		如果当前位置永远不会被击中
		if(tu[u.x][u.y]>1e8) cout<<u.t,exit(0);
		for(int i=0;i<4;i++)
		{
			int nx=u.x+dx[i];
			int ny=u.y+dy[i];
			//在非负网格中,横纵坐标可以无限延伸,x>301,y>=301的情况是许可并且安全的
			//如果不写这行代码而是改用正常的判断,安全点根本不会入队
			if(nx>301 or ny>301) cout<<u.t+1,exit(0);
//			检查边界:这样也可以避免访问到无效下标
			if(nx<0 or ny<0) continue;
//			vis检查
			if(vis[nx][ny]) continue;
//			检查到达时间是否早于流星撞击时间
			if(u.t+1<tu[nx][ny])
			{
				vis[nx][ny]=1;
				q.push({nx,ny,u.t+1});
			}	
		}

知识网络

搜索,BFS

posted @ 2026-02-06 16:06  左边之上  阅读(2)  评论(0)    收藏  举报