共有
M
M
M颗流星
(
1
≤
M
≤
50000
)
(1≤M≤50000)
(1≤M≤50000)会坠落在农场上,其中第
i
i
i颗流星会在时刻
T
i
T_i
Ti砸在坐标为
(
X
i
,
Y
i
)
(
0
≤
X
i
,
Y
i
≤
300
)
(X_i,Y_i)(0≤X_i,Y_i≤300)
(Xi,Yi)(0≤Xi,Yi≤300) 的格子里。流星会将它所在的格子,以及周围
4
4
4个相邻的格子都化为焦土,无法在这些格子上行走。贝茜在时刻
0
0
0开始行动,只能在第一象限中,平行于坐标轴行动,每
1
1
1个时刻中,移动到相邻的格子中。计算最少需要多少时间才能到达一个安全的格子。如果不可能到达输出
−
1
−1
−1。
本题要求计算最少需要多少时间可以看出需要使用广度搜索,需要注意的是我们需要计算每个格子化为焦土的时间,这个时间应该是最小值。文章来源地址https://www.toymoban.com/news/detail-613525.html
#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
int flag[310][310],vis[310][310];
int m,xx,yy,Time;
int ans[301][301];
queue<int> q[2];
int main()
{
cin>>m;
memset(flag,-1,sizeof(flag));
for(int i=1;i<=m;i++)
{
cin>>xx>>yy>>Time;
for(int j=0;j<=4;j++)
if((xx+dx[j])>=0&&(yy+dy[j])>=0)
{
if(flag[xx+dx[j]][yy+dy[j]]!=-1)
flag[xx+dx[j]][yy+dy[j]]=min(Time,flag[xx+dx[j]][yy+dy[j]]);
else flag[xx+dx[j]][yy+dy[j]]=Time;
}
}
q[0].push(0);q[1].push(0);
while(q[0].empty()==0&&q[1].empty()==0)
{
int x,y;
x=q[0].front();y=q[1].front();
q[0].pop();q[1].pop();
if(flag[x][y]==-1){cout<<ans[x][y]<<endl;return 0;}
for(int i=1;i<=4;i++)
{
int x1=x+dx[i],y1=y+dy[i];
if(x1>=0&&y1>=0&&vis[x1][y1]!=1&&((flag[x1][y1]>(ans[x][y]+1))||flag[x1][y1]==-1))
{
//cout<<x1<<" "<<y1<<endl;
q[0].push(x1);q[1].push(y1);
ans[x1][y1]=ans[x][y]+1;
vis[x1][y1]=1;
}
}
}
cout<<"-1"<<endl;
return 0;
}
文章来源:https://www.toymoban.com/news/detail-613525.html
到了这里,关于[USACO08FEB] Meteor Shower S BFS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!