Meteor Shower——很坑的基础bfs

作为一名新手菜鸡,我是真的觉得这道bfs坑,写个题解帮助入坑了的小伙伴

题意

:就是这个人在原点处,然后有流星会不定时的撞击到某个点上,上下左右中五个地方都会被破坏。问它能否逃跑,能的话用时多少,不能的话输出-1

思路:模板bfs,注意地图的范围不是在300以内,其余思路见代码注释,本人是新手,代码思路参考了大佬的,但是自己写的,有错误请指正

在这里插入代码片
``#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 305;
int meteor[N+1][N+1] = {
   0};//标记流星撞击的点 
int dx[4] ={
   0,1,0,-1};//左下右上四个方向 
int dy[4] = {
   -1,0,1,0};
int visit[N+1][N+1]={
   0}; 
struct Step
{
   
	int x;
	int y;
	int steps;//代表步数 
};
queue<Step> q;
int main()
{
   
	int m;
	cin>>m;
	int x,y,t;
	memset(meteor,-1,sizeof(meteor));//把所有的点初始化为-1 
	memset(visit,0,sizeof(visit));//判断是否走过 
	while(m--)
	{
   
		cin>>x>>y>>t;
		//这里也很重要 
		if(meteor[x][y]==-1) 	meteor[x][y] = t;
		else 
		{
   
			meteor[x][y] = min(meteor[x][y],t);//有可能同一个点会被撞击多次,
												//我们取最先撞击的那个流星的时间 
		}
		for(int i=0;i<4;i++)
		{
   
			int nextx = x+dx[i];
			int nexty = y+dy[i];
			if(nextx<0||nexty<0) continue;
			if(meteor[nextx][nexty]==-1) 	meteor[nextx][nexty] = t;//首先要看这个点的四周的点被撞击过没 
			else 
			{
   
				meteor[nextx][nexty] = min(meteor[nextx][nexty],t);//如果被撞击过,同理取最先的 
			}
		}
	}
	Step begin;
	begin.x = 0;
	begin.y = 0;
	begin.steps =0;
	visit[0][0] = 1;
	q.push(begin);//初始状态:在点(0,0)移动次数为0 

	while(!q.empty())
	{
   
		Step s = q.front();
		q.pop();	
		if(meteor[s.x][s.y]==-1)
		{
   
			cout<<s.steps<<endl;
			return 0;
		}
		for(int i=0;i<4;i++) 
		{
   
				 Step next;
				 next.x = s.x+dx[i];
				 next.y = s.y+dy[i];
				next.steps = s.steps+1;
				if(next.x<0||next.y<0||visit[next.x][next.y]==1) continue;//越界或者走过 ,
				//这里一定不要判断不能大于300,具体上限本人也不是很清楚,但这样可以过,应该没卡数据 
				if(meteor[next.x][next.y]==-1) //安全 就直接结束bfs,这样的结果肯定是最优的 
				{
   
					cout<<next.steps<<endl;
					return 0;
				}
				if(meteor[next.x][next.y]>next.steps)//在到达安全点前,经过的点,
														//被撞击的时间必须大于它到达的时间 
				{
   
					q.push(next);
					visit[next.x][next.y] = 1;
				} 
		} 	
	}
	cout<<"-1"<<endl;//如果不能到达则输出-1,如果在0,0处就被撞死了也是这里输出-1 
	return 0;
}
全部评论

相关推荐

不像现在的我,已经是虚伪的社会人了。
真烦好烦真烦:好有个性的一段话,导师没有让你修改吗
点赞 评论 收藏
分享
04-13 18:10
门头沟学院 Java
想熬夜的小飞象在秋招:被腾讯挂了后爸妈以为我失联了
点赞 评论 收藏
分享
mjasjon:这种trash中厂 简历过筛概率比大厂还低(除阿里系)
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
头像
05-16 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务