搜索>>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

浙公网安备 33010602011771号