[USACO08FEB] Meteor Shower S BFS

共有 M M M颗流星 ( 1 ≤ M ≤ 50000 ) (1≤M≤50000) (1M50000)会坠落在农场上,其中第 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)(0Xi,Yi300) 的格子里。流星会将它所在的格子,以及周围 4 4 4个相邻的格子都化为焦土,无法在这些格子上行走。贝茜在时刻 0 0 0开始行动,只能在第一象限中,平行于坐标轴行动,每 1 1 1个时刻中,移动到相邻的格子中。计算最少需要多少时间才能到达一个安全的格子。如果不可能到达输出 − 1 −1 1
本题要求计算最少需要多少时间可以看出需要使用广度搜索,需要注意的是我们需要计算每个格子化为焦土的时间,这个时间应该是最小值。

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值