首页 > 编程语言 >C++逃离陨石

C++逃离陨石

时间:2023-11-06 16:55:20浏览次数:31  
标签:yy int 陨石 C++ 逃离 xx && include 小朱

题目描述

在公元\(114514\)年小朱在学校里上课,突然听见学校广播播放一条骇人听闻的消息:一群陨石将袭击我市,由于陨石积过大数量多,它们无法在撞击到地面前燃烧 殆尽,将会对它撞到的一切东西造成毁灭性的打击。
小朱同志开始担心自己的 安全问题。他一定要在被流星砸到前,到达一个安全的地方 (也就是说,一块不会被任何流星砸到的土 地)。如果将我市放入一个直角坐标系中, 小朱同志现在的位置是原点,并且,小朱同志不能踏上一块被流星砸过的土地。

根据预 报,一共有\(M\)颗流星\((1<=M<=50,000)\)会坠落在我市上,其中第\(i\)颗流星会在时刻 \(Ti\)\((0<=Ti​<=1,000)\)砸在坐标为\((Xi,Yi)\)\((0<=Xi<=300;0<=Yi<=300)\)的格子里。流星的力量会将它所在的格子,以及周围\(4\)个相邻的格子都化为焦土,当然 小朱同志也无法再在这些 格子上行走。
小朱同志在时刻\(0\)开始行动,它只能在第一象限中, 平行于坐标轴行动,每\(1\)个时刻中,他能移动到相邻的(一般是\(4\)个)格子中的任意一个, 当然目标格子要没有被烧焦才行。如果一个格子在时刻\(t\)被流星撞击或烧焦,那么小朱同志 只能在\(t\)之前的时刻在这个格子里出现。

请你计算一下,小朱同志最少需要多少时间才能到 达一个安全的格子。

输入格式

第\(1\)行: \(1\)个正整数:\(M\)

第\(2...M+1\)行:

第\(i+1\)行为\(3\)个用空格隔开的整数:\(Xi\),\(Yi\),以及\(Ti\)

输出格式

输出1个整数,即小朱同志逃生所花的最少时间。

如果小朱同志无论如何都无法在陨石坠落中存活下来,输出 -1

样例

输入样例

5
0 0 2
2 1 3
1 1 3
0 2 3
8 9 0

输出样例

3

Tips:

输入说明:
一共有\(4\)颗流星将坠落在霸中,它们落地点的坐标分别是\((0,0)\),(2,1),$(2,1) \(,\)(1,1)$ 以及\((0,3)\),时刻分别为\(2\),\(2\),2,\(2\),\(5\)。

\(AC\)代码:

/*****************
备注:
*****************/
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
#define LL long long
#define MAXM 3010
#define MAXN 3010
const int N =300+10; 
const int INF =0x3f3f3f3f;
int m,x,y,t,a[N][N];
int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};
bool v[N][N];
struct node
{
	int x,y,num;	
};
queue<node> q;
void bfs()
{
	q.push((node){0,0,0});
	v[0][0]=1;
	while(!q.empty())
	{
		node top=q.front();
		q.pop();
		if(a[top.x][top.y]==-1)
		{
			cout<<top.num;
			exit(0);
		}
			
		for(int i=1;i<=4;i++)
		{ 			
			int xx=top.x+dx[i];
			int yy=top.y+dy[i];
			if(xx>=0 && yy>=0 && (a[xx][yy]==-1 || a[xx][yy]>top.num+1)&& v[xx][yy]==0)
			{
				q.push((node){xx,yy,top.num+1});
				v[xx][yy]=1;
			}
		}
	}
}
int main ()
{
	memset(a,-1,sizeof(a));
	cin>>m;
	while(m--)	
	{
		cin>>x>>y>>t;	
		for(int i=0;i<5;i++)
		{
			int xx=x+dx[i];
			int yy=y+dy[i];
			if(xx>=0 && yy>=0 &&(a[xx][yy]==-1 || a[xx][yy]>t))
			a[xx][yy]=t;
		}
		
		
	}	
	bfs();		
	cout<<-1;
   return 0;
}

标签:yy,int,陨石,C++,逃离,xx,&&,include,小朱
From: https://www.cnblogs.com/AZAjr09-123/p/17813129.html

相关文章

  • C++最自信的鱼
    题目描述人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都......
  • C++U5-04-广度优先搜索1
    广搜逻辑  广搜代码核心思路 广搜伪代码 思维导图1、[【广搜】走迷宫] 求最少需要多少步,考虑使用广搜。从起点开始进行搜索,规则只能向上下左右走动,当搜索到终点时就结束。广搜的核心思路:初始化一个队列和数组将起点入队并标记当队列不为空且没到终点的时候 取......
  • C++使用冒泡排序算法对数组进行排序
     #include<iostream>//包含iostream库usingnamespacestd;//使用标准命名空间intmain(){//主函数intarr[]={5,3,2,8,6,7,1,4};//定义并初始化数组intn=sizeof(arr)/sizeof(arr[0]);//计算数组长度//使用冒泡排序算法对数组进......
  • 力扣905 按奇偶排序数组 C++ 双指针+一次遍历
    905.按奇偶排序数组classSolution{public:vector<int>sortArrayByParity(vector<int>&nums){inti=0,j=nums.size()-1;while(i<nums.size()-1&&i<j){while(i<j&&(nums[i]%2==0))i++;......
  • C++_18_多态 - 重写版
     多态:面向对象三大概念:封装、继承、多态!可想而知多态是何等的重要多态的概念以及前提条件:编译期绑定(静态联编):函数入口地址和函数名在编译期间绑定,即编译期间确定函数名和入口地址唯一对应运行期绑定(动态联编):函数入口地址和函数名在编译期间不绑定......
  • C++_17_多继承和虚基类 - 重写版
    多继承单继承:一个派生类只有一个基类,这就是单基类继承,简称“单继承”多继承:一个派生类允许有两个及以上的基类,这就是多基类继承,简称“多继承”单继承中,派生类是对基类的特例化,例如编程类书籍是书籍中的特例。而多继承中,派生类是所有基类的一种组合。在多继承中,派......
  • C++_15_友元函数和友元类 - 重写版
    友元函数和友元类友元函数:通过friend关键字,将不属于当前类的函数在当前类中加以声明,使其成为友元函数,同时该函数能够访问private属性的成员变量。友元类:有有元函数,自然也能有友元类,通过friend关键字,将类A在类B中声明,那么类A会成为类B的友元类注意:1、友......
  • C++_14_常量指针—this指针 - 重写版
    常量指针—this指针this指针:成员函数一般都会拥有一个常量指针(this),指向调用函数的对象,储存的是改对象的首地址(注意:静态成员函数是没有this指针的)//标准写法classbook{public:book(){this->price=0.0;this->title=NULL;}private:doubleprice;char......
  • C++_22_string类型 - 重写版
    string类型·变量定义C++中提供了一个string内建数据类型,它可以替代C语言中的char*数组。使用string数据类型时,需要在程序中包含头文件<string>#include<iostream>#include<string>usingnamespacestd;intmain(){strings1;//......
  • C++_21_重载、重写、重定义 - 重写版
    1、重载同一作用域的同名函数,重复定义;参数格式、参数顺序或者参数类型不同;函数重载和函数的返回值没有任何关系;(const类型的重载本质上是参数类型不同) 2、重写(覆盖)有继承关系子类(派生类)重写父类(基类)的虚函数函数的返回值,函数名字,函数参数,必须和基类中的虚函数一致,主要就是覆盖......