首页 > 其他分享 >洛谷 P1332 血色先锋队 C语言 bfs

洛谷 P1332 血色先锋队 C语言 bfs

时间:2024-11-30 13:30:17浏览次数:7  
标签:血色 洛谷 int 领主 感染 C语言 bfs 军团 瘟疫

题目:

https://www.luogu.com.cn/problem/P1332#submit

题目背景

巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经开始调查瘟疫的源头。原来是血色先锋军的内部出现了叛徒,这个叛徒已经投靠了天灾军团,想要将整个血色先锋军全部转化为天灾军团!无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。

题目描述

军团是一个 n 行 m 列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一个小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间,并且将它报告给巫妖王,以便对血色先锋军进行一轮有针对性的围剿。

输入格式

第 1 行:四个整数 n,m,a,b,表示军团矩阵有 n 行 m 列。有 a 个感染源,b 为血色敢死队中领主的数量。

接下来 a 行:每行有两个整数 x,y,表示感染源在第 x 行第 y 列。

接下来 b 行:每行有两个整数 x,y,表示领主的位置在第 x 行第 y 列。

输出格式

第 1 至 b 行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。如果某个人的位置在感染源,那么他感染瘟疫的时间为 0。

思路:同源出发点,先把感染源放进队列里面,计算到达矩阵各个坐标的位置的时间,最后按顺序输入领主坐标存入结构体类型数组,最后按序输出领主坐标。

注意:处理好临界条件,stl状态设置,开好数组大小.正常bfs格式就已经解决,为了维持输出格式,可以将领主的坐标存入结构体类型的数组,最后按序输出即可。

#include <iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct Node{
	int x;
	int y;
};
const int N = 1e5+5;
Node boss[N];//结构体类型的临时数组,储存领主坐标 
int dx[] = {1,0,-1,0};//方向数组 
int dy[] = {0,-1,0,1};
bool stl[505][505];//状态数组 
int map[505][505];//地图 
int n,m,a,b; 
int main() 
{
	queue <Node> q; 
	memset(map,-1,sizeof map);//初始map数组为-1 
	cin >> n >> m >> a >> b;
	for(int i = 1 ; i <= a ;i++)//a个传染源压入队列 
	{
		int x,y;
		cin >> x >> y;
		map[x][y] = 0;//感染源初始化为0 
		stl[x][y] = true;//标记已访问 
		Node start = {x,y};
		q.push(start);//压入队列 
	}
	while(!q.empty())
	{
		int x = q.front().x;
		int y = q.front().y;
		for(int k = 0 ; k < 4 ; k++)
		{
			int tx = x + dx[k];
			int ty = y + dy[k];
			if(tx >= 1 && tx <= n && ty >= 1 && ty <= m && stl[tx][ty] == false)
			{
				stl[tx][ty] = true;
				map[tx][ty] = map[x][y] + 1;
				Node nowpos = {tx,ty};
				q.push(nowpos);//压入队列 
			}
		}
		q.pop(); //出队 
	}
	for(int i = 1 ; i <= b ; i++)//输入领主坐标存入结构体类型的数组 
	{
		int x,y;
		cin >> x >> y;
		boss[i] = {x,y};
	}
	
	for(int i = 1 ; i <= b ; i++)//按序输出领主感染时间 
	{
		cout << map[boss[i].x][boss[i].y] << endl;
	}
	

	return 0;
}

标签:血色,洛谷,int,领主,感染,C语言,bfs,军团,瘟疫
From: https://blog.csdn.net/zqystca/article/details/144143230

相关文章

  • 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 不合题意),所以种情况为无解,输......
  • C语言笔记--函数
    C语言中函数的分类1.库函数2.自定义函数库函数那怎么学习库函数呢?简单看看:www.cplusplus.com简单的总结,C语言常用的库函数都有:IO函数字符串操作函数字符操作函数内存操作函数时间/日期函数数学函数其他库函数注:但是库函数必须知道的一个秘密就是:使用库函数,必须......
  • 差分约束 + 01BFS
    属于简单知识点的补档。差分约束差分约束系统是一种特殊的\(n\)元一次不等式组,包含\(n\)个变量\(x_1,\dots,x_n\)和\(m\)个约束条件,每个约束条件形如\(x_i-x_j\lec_k\),其中\(c_k\)是常数。我们要解决的问题是求出\(x_1,\dots,x_n\)的一组解。差分约束问题是最短......