首页 > 其他分享 >流星雨(BFS)

流星雨(BFS)

时间:2024-12-26 19:43:30浏览次数:4  
标签:int pos BFS ny && maze inf 流星雨

题目 : 链接:https://vjudge.net/problem/POJ-3669

题意:流星雨来袭,一共有m颗陨石,每颗ti时间点的陨石砸击(xi,yi)以及其上下左右共5个点,在砸击的时刻及砸击后人都不能踏上这个点。在第一象限内,人位于原点(0,0),每次可以上下左右移动一次,找到达到安全位置的最短时间

思路:开一张数表maze初始化所有元素为inf,然后在maze标记每个格子被陨石影响的最初时间点

人从(0,0)开始bfs,若遇到maze[nx][ny]为inf即为结束状态,输出此时的时间,否则,比较此时时刻t加上1与maze[nx][ny]的大小,若t+1更小说明能够踏上nx,ny的点,把这个点放入队列

注意:

初始原点位置:如果maze[0][0]=0说明直接被砸死,直接return,不能将其放入队列中
数组越界问题:这道题目要求陨石落下位置xi,yi是>=0并且<=300的 然而安全位置的x,y可以超过300
同样的bfs中,上下左右移动时也要判断nx,ny是否越界
避免重复将某个点放入队列,可以将这个点大小更新为t+1,这样一来以后(t+1)+1>t+1 不会再回去了(用bool数组应该也行

建议:

结构体还是写得简洁一点比较好orz

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
const int inf = 1e5;
int m;
int dx[]={0,0,0,-1,1};
int dy[]={0,1,-1,0,0};
struct meteor{
	int x;
	int y;
	int t;
};
struct now{
	int x;
	int y;
	int t;
};

now pos;
queue<now>q;
int maze[305][305];
int bfs()
{
	if(maze[0][0]==0)
	{
		return -1;
	}
	
	q.push({0,0,0});
	while(!q.empty())
	{
		pos=q.front();
		if(maze[pos.x][pos.y]==inf)return pos.t;
		q.pop();
		for(int i=1;i<=4;i++)
		{
			int nx=pos.x+dx[i];
			int ny=pos.y+dy[i];
			if(nx>=0&&ny>=0&&pos.t+1<maze[nx][ny])
			{
				if(maze[nx][ny]==inf)return pos.t+1;
				else{
						maze[nx][ny]=pos.t+1;					
				}
				q.push({nx,ny,pos.t+1});
			}
		}
	}
	return -1;
}


signed main()
{
	
	scanf("%d",&m);
	for(int i=0;i<=304;i++)
	{
		for(int j=0;j<=304;j++)
		{
			maze[i][j]=inf;
		}
	}
	
	
	for(int i=1;i<=m;i++)
	{
		int x,y,t;
		scanf("%d%d%d",&x,&y,&t);
		for(int j=0;j<=4;j++)
		{
		if(x+dx[j]>=0&&y+dy[j]>=0&&x+dx[j]<=300&&y+dy[j]<=300)maze[x+dx[j]][y+dy[j]]=min(t,maze[x+dx[j]][y+dy[j]]);
		}
	}
	
	
	cout<<bfs()<<endl;
	return 0;
}

标签:int,pos,BFS,ny,&&,maze,inf,流星雨
From: https://www.cnblogs.com/benscode/p/18634066

相关文章

  • 【算法】【优选算法】宽搜(BFS)中队列的使用
    目录一、429.N叉树的层序遍历二、103.⼆叉树的锯⻮形层序遍历三、662.⼆叉树最⼤宽度四、515.在每个树⾏中找最⼤值一、429.N叉树的层序遍历题目链接:429.N叉树的层序遍历题目描述:题目解析:层序遍历N叉树,每一层的节点是由null分开每一层节点的val值放入一个数......
  • BFS广度优先
    个人最喜欢的算法之一,这是一种犹如洪水般的算法,O(n)的时间复杂度。##红色不可流动,橙色可流动,黄色所在点,蓝色在队列里。就像洪水一样,当你得到某个位置时候,开始判断它的上下左右是否可流动并判断有没有流过。 开始判断它的上下左右是否可流动并判断有没有流过,若可以放入上下左......
  • Cheese Aizu - 0558 (BFS)
    题目链接:https://vjudge.net/problem/Aizu-0558#author=GPT_zh题意:给你一个h*w的矩阵,(.代表空地。X代表障碍物,数字1~n分别代表n个不同的cheese)老鼠从起始位置S开始,挨个去找和它能力值(power)相等的cheese去吃,输出吃完n个cheese所需要的步长。思路:BFS搜索,即先找和power相同的c......
  • 星号游走程序(流星雨):一个多彩的控制台动画
    引言在这个项目中,我将介绍一个名为“星号游走程序”的控制台应用程序。该程序通过控制台输出渐变色的星号,并支持多种游走模式和用户交互。本文将详细介绍程序的功能、实现方式以及如何使用它。功能概述1.随机游走模式在随机游走模式下,星号会在控制台内随机移动,形成一种动......
  • 一篇入门广度优先搜索BFS
    注:本篇博客参考《算法图解》,读者阅读BFS一篇时大受启发所以想要记录下来并搭配例题给网友分享。BFS解决的问题从节点A出发,有前往节点B的路径吗?从节点A出发,前往节点B的哪条路径最短?应用:图的遍历搜索,最短路径,层级遍历,网络爬虫等一个例子+一个例题搞懂BFS把人和人的关......
  • 《Detecting probe resistant proxy》论文阅读、验证与obfs4proxy分析
    1引言当时看到这篇对代理检测的论文,对它的中文讨论较少,整理了自己阅读和实验后的笔记(关注于tor的obfs4),方便有需要的同学一起学习讨论。(现在obfs4都要过时啦,出了新的WebTunnels,但是嘛,升级迭代也要相当一段时间了)2论文阅读2.1探针选择我们的攻击集中在这样一个观察上,......
  • BFS入门笔记
    BFS入门笔记BFS广度优先搜索,在处理问题时,优先考虑更多的机会,而不是像DFS那样优先走一条路,再回溯BFS基于队列实现,目的是把可能的解放在同一层处理,即BFS队列中至多只有两层的解考虑完前一层可能的解后,再考虑下一层的解。把当前解的后续解再放到队列尾部。如上图中,BCDE处在同一......
  • COMP 250 BFS traversal
    FinalProjectCOMP250Fall2024posted:Wednesday,Dec.4,2024due:SundayDec.15,2024,at23:59forachancetoreceiveMastery,ORFriday,Dec.20,2024at23:59GeneralInstructionsSubmissioninstructions–Pleasenotethatthesubmissiondeadlinefo......
  • 【C++动态规划 BFS 博弈】3283. 吃掉所有兵需要的最多移动次数|2473
    本文涉及知识点C++动态规划C++BFS算法数学博弈LeetCode3283.吃掉所有兵需要的最多移动次数给你一个50x50的国际象棋棋盘,棋盘上有一个马和一些兵。给你两个整数kx和ky,其中(kx,ky)表示马所在的位置,同时还有一个二维数组positions,其中positions[i]=[x......
  • 洛谷 P3395 路障 C语言 bfs(想复杂的思路)
    题目:https://www.luogu.com.cn/problem/P3395题目描述B君站在一个n×n 的棋盘上。最开始,B君站在(1,1) 这个点,他要走到(n,n) 这个点。B君每秒可以向上下左右的某个方向移动一格,但是很不妙,C君打算阻止B君的计划。每秒结束的时刻,C君会在 (x,y)上摆一个路障。B......