首页 > 其他分享 >洛谷 P2895 [USACO08FEB] Meteor Shower S C语言 bfs

洛谷 P2895 [USACO08FEB] Meteor Shower S C语言 bfs

时间:2024-11-30 13:30:53浏览次数:13  
标签:洛谷 格子 int 贝茜 C语言 bfs fire 320 陨石

题目:

https://www.luogu.com.cn/problem/P2895

题目描述

贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。

如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。

根据预报,一共有 M 颗流星 (1≤M≤50,000) 会坠落在农场上,其中第 i 颗流星会在时刻 Ti(0≤Ti≤10000)砸在坐标为  (Xi​,Yi​)(0≤Xi​≤300,0≤Yi≤300)的格子里。流星的力量会将它所在的格子,以及周围 4 个相邻的格子都化为焦土,当然贝茜也无法再在这些格子上行走。

贝茜在时刻 0 开始行动,她只能在会在横纵坐标 X,Y≥0 的区域中,平行于坐标轴行动,每 1 个时刻中,她能移动到相邻的(一般是 4 个)格子中的任意一个,当然目标格子要没有被烧焦才行。如果一个格子在时刻 tt 被流星撞击或烧焦,那么贝茜只能在 tt 之前的时刻在这个格子里出现。 贝茜一开始在 (0,0)。 

请你计算一下,贝茜最少需要多少时间才能到达一个安全的格子。如果不可能到达输出 −1。

输入格式

共 M+1行,第 1 行输入一个整数 M,接下来的 M 行每行输入三个整数分别为 Xi​,Yi​,Ti​。

输出格式

贝茜到达安全地点所需的最短时间,如果不可能,则为 −1。

思路:先用一个数组fire计算出陨石坠落的时间和范围,注意范围会延伸到最大301。注意应陨石坠落的最小时间,为了方便比较,我们填充fire数组为INT_MAX.解决完陨石时间数组填充后,在用map数组计算到达每个位置的时间,判断条件注意的是到达这个点的时间要小于陨石坠落的时间。

代码如下:

#include <iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<climits>
using namespace std;
struct Node{
	int x;
	int y;
};
int dx[] = {1,0,-1,0};//方向数组 
int dy[] = {0,-1,0,1};
int M;
int map[320][320];//地图 
int fire[320][320];//陨石范围数组 
bool stl[320][320];//状态数组 
queue <Node> q;//队列 
int bfs(int x,int y)
{
	Node start = {x,y};//创建并将起点放入队列 
	map[x][y] = 0;//起点时间为0 
	q.push(start);
	stl[x][y] = true; 
	
	while(!q.empty())
	{
		int x = q.front().x;
		int y = q.front().y;
	//	cout << x << " " << y << endl;
		for(int k = 0 ; k < 4 ; k++)
		{
			int tx = x + dx[k];
			int ty = y + dy[k];
			
			if(tx >= 0 && tx <= 310 && ty >= 0 && ty <= 310 &&  map[x][y] + 1 < fire[tx][ty] && stl[tx][ty] == false)
			{
				stl[tx][ty] = true;//标记已经过 
				map[tx][ty] = map[x][y] + 1;
				
				Node newpos = {tx,ty};
				q.push(newpos);//进入队列 
				
				if(fire[tx][ty] == INT_MAX)//判断是否到达安全点 
				{
					return map[tx][ty];
				}
			}
		}
		q.pop(); 
	}
	return -1;
}
int main() 
{
	cin >> M;
	for(int i = 0 ; i <= 319 ; i++)
	{
		for(int j = 0 ; j <= 319 ; j++)
		{
			fire[i][j] = INT_MAX;
		}
	}
//	memset(fire,INT_MAX,sizeof fire);
	for(int i = 1 ; i <= M ; i++)
	{
		int x,y,t;
		cin >> x >> y >> t;
		fire[x][y] = min(fire[x][y],t);//陨石点也要赋值 
		for(int k = 0 ; k < 4 ; k++)//将fire地图上的所有陨石地点时间输入 
		{
			int tx = x + dx[k];
			int ty = y + dy[k];
			if(tx >= 0 && tx <= 301 && ty >= 0 && ty <= 301)//焦土会超过300到达301 
			{
				fire[tx][ty] = min(fire[tx][ty],t);//将更短的时间存入 
			}
		}
	}
    cout << bfs(0,0);
	return 0;
}

标签:洛谷,格子,int,贝茜,C语言,bfs,fire,320,陨石
From: https://blog.csdn.net/zqystca/article/details/144153364

相关文章

  • 洛谷 P1162 填涂颜色 C语言 bfs
    题目:https://www.luogu.com.cn/problem/P1162由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×6的方阵(n=6),涂色前和涂色后的方阵如下:如果从某个 0 出发,只向上下左右 4 个方向移动且仅经过其他 00 的情......
  • 洛谷 P1332 血色先锋队 C语言 bfs
    题目:https://www.luogu.com.cn/problem/P1332#submit题目背景巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以......
  • C语言之用链表的方式解析与运算简单的波兰表达式
    C语言之用链表的方式解析与运算简单的波兰表达式我这里说的简单的波兰表达式,是指没有嵌套的加减乘除表达式,如:(+12),(-100905)定义基本的数据结构定义数据类型,全用大写字母,DT开头,后面附加类型名字:DT_OPERATOR定义表达式结构体,Express,自定义为Expr定义链表节点结......
  • C语言经典例题-13
    1.小乐乐走台阶题目描述:小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?输入描述:输入包含一个整数n(1≤n≤30)输出描述:输出一个整数,即小乐乐可以走的方法数。示例1输入:2输出:2示例2输入:10......
  • C语言中的结构体
    一.结构体声明首先要知道结构的成员可以是标量、数组、指针,甚至是其他结构体。例如描述一个学生:structStu{charname[20];intage;charsex[5];};那么如何创建一个结构体变量?intmain(){structStua,b,c;return0;}或者structStu{charname[20];......
  • C语言实现数组堆并解决TopK问题
    还是先定义结构体typedefintHPDataType;typedefstruct{HPDataType*array;intsize;intcapacity;}HP;voidHeapInit(HP*php){assert(php);php->array=NULL;php->capacity=php->size=0;}首先是它的初始化。voidHeapDestroy......
  • P5015 [NOIP2018 普及组] 标题统计 C语言
    先说思路:跟着题意来就好,其实更多的是考察fgets()函数的基础运用,之后用循环遍历字符串,若是遇到空格和换行符就不计入,反之count++;这里也可以直接用isalnum()直接对输入的字符是否是字母或是数字进行判断。以下是代码实现:#include<stdio.h>#include<ctype.h>intmain(){......
  • c语言动态通讯录
    首先我们得明确它的基本功能,信息:1.人的信息:姓名+年龄+性别+地址+电话2.通讯录的可以存放100个人的信息3.功能:1>增加联系人2>删除指定联系人3>查找指定联系人的信息4>修改指定联系人的信息5>显示所有联系人的信息6>排序(姓名,年龄)test.c 测试通讯录contact.c 通讯......
  • C语言 - 指针,数组
    指针指针入门创建变量intage=10;创建指针,指向变量指针类型*指针变量=&变量int*p=&age;当有了指针之后,就可以通过指针操作他指向的数据了通过指针获取指向的位置的数据,在指针前面加一个*为解引用指针前加*修改,改的是指针指向的位置的值指针的作用:游......
  • 洛谷 【LGR-206-Div.3】洛谷基础赛 #17 & Diligent-OI Round 1 的 第二题 P11272「Dil
    1.首先,这道题涉及到了区间和和区间积,所以需要用到前缀和s[N]。2.然后,题目解释需要分类讨论!!!下文中的n为n=r-l+1;!!!并非题干中的n;当k >= n时,区间积+k>=k,即使区间全部为1,区间和也是n。(但是如果全为1 区间积+k就为k+1 不合题意),所以种情况为无解,输......