题解 【洛谷P1332】血色先锋队
题面:https://www.luogu.org/problemnew/show/P1332
很容易看出,这是一个典型的广度优先搜索,也就是众多OIer口中的bfs。
先给各位普及一下bfs(部分来自百度):
广度优先搜索(Breadth-First Search),又称作宽度优先搜索,或横向优先搜索,简称bfs,是一种基础算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。广度优先搜索的实现一般采用队列。
其实,广度优先搜索是搜索算法的基础,想要成为一名优秀的OIer,广度优先搜索和深度优先搜索都是必须掌握的!
此题告诉了我们有A个感染源,B个领主,我们可以定义一个vis数组,若当前坐标的vis值为1,那么此处就没有被感染;否则,当前坐标就已被感染。
我们可以首先用bfs算出每个坐标被感染的时间,最后直接输出领主被感染的时间即可。
话不多说,上代码:
#include<bits/stdc++.h>//万能头文件
using namespace std;//开启标准名字空间
struct Node
{
int x,y,Time;//x为横坐标,y为纵坐标,Time为被感染时间
} s[];//设置结构体数组维护队列
int head,tail;//分别为头指针、尾指针
int n,m,a,b,vis[][],c[],d[],e,f,i,j,
k;//vis的意义同分析,c数组和d数组为感染源坐标,e、f为领主坐标
int P[][];//每个坐标被感染时间
void bfs() //开始bfs
{
tail=;
head=;//初始化指针
for(i=; i<=a; i++) //先把已知条件加入队列,并初始化时间
{
s[++tail].x=c[i];//相当于tail++,s[tail].x=c[i]
s[tail].y=d[i];
s[tail].Time=;
P[c[i]][d[i]]=;
}
while(head<tail) //如果队列中还有元素
{
head++;//头指针加1
int h=s[head].x,r=s[head].y,tmp=s[head].Time;//取出队首元素
if(h+<=n && vis[h+][r]==) //往右扩展,若合法加入队列
{
s[++tail].x=h+;//更新x坐标
s[tail].y=r;//更新y坐标
P[h+][r]=s[tail].Time=tmp+;//更新时间
vis[h+][r]=;//记录为已被感染
}
//以下每步操作意义同上
if(h->= && vis[h-][r]==) //往左扩展,若合法加入队列
{
s[++tail].x=h-;
s[tail].y=r;
P[h-][r]=s[tail].Time=tmp+;
vis[h-][r]=;
}
if(r+<=m && vis[h][r+]==) //往上扩展,若合法加入队列
{
s[++tail].x=h;
s[tail].y=r+;
P[h][r+]=s[tail].Time=tmp+;
vis[h][r+]=;
}
if(r->= && vis[h][r-]==) //往下扩展,若合法加入队列
{
s[++tail].x=h;
s[tail].y=r-;
P[h][r-]=s[tail].Time=tmp+;
vis[h][r-]=;
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&a,&b);//输入矩阵大小、感染源个数和领主个数
for(i=; i<=a; i++)
{
scanf("%d%d",&c[i],&d[i]);//输入感染源坐标
vis[c[i]][d[i]]=;//记录为已被感染
}
bfs();//遍历每个坐标被感染的时间
for(i=; i<=b; i++)
{
scanf("%d%d",&e,&f);//输入领主坐标
printf("%d\n",P[e][f]);//直接输出被感染时间
}
return ;//结束
}
有些人直接枚举每一个领主和感染源,求他们曼哈顿距离,但在矩阵过大时会TLE,所以bfs总是比暴力好的。
题解 【洛谷P1332】血色先锋队的更多相关文章
- 洛谷 P1332 血色先锋队
P1332 血色先锋队 题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...
- P1332 血色先锋队
P1332 血色先锋队 题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
随机推荐
- 关于GC(垃圾回收)
当我用new创建一个对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能.下面的建议可以避免GC频繁操作 ...
- Java中Thread方法启动线程
public class ThreadTest extends Thread { private int count = 10; @Override public void run() { //重写 ...
- HTML表格概念、语法、操作、案例
创建两行三列表格 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- vscode侧边栏字体大小修改
1.找到安装路径下,workbench.desktop.main.css 文件 C:\z_my_install\Microsoft VS Code\resources\app\out\vs\workb ...
- UVA-1588
只用C来写 题目:https://vjudge.net/problem/UVA-1588 #include<stdio.h> #include<string.h> #defin ...
- CMake 复制文件方法
我们经常会遇到将第三方库文件复制到项目运行时文件夹,或者将子项目生成的库文件复制到项目运行时文件夹的情况,本文介绍FILE-COPY.add_custom_command.ADD_CUSTOM_TAR ...
- MySQL char与varchar 的区别
一.差异 1.占用存储空间上 char 初始化时占固定空间,varchar依据插入内容大小使用空间. 2.char最大字符长度255个(约0.1KB),varchar则是65535(约192KB). ...
- lvs基础
lvs类型 lvs-nat: 上下文为masquerade 多目标的DNAT(iptables): 它通过修改请求报文的目标IP地址(同时可能会修改目标端口)至挑选出某RS的RIP地址实现转发: 特性 ...
- .net mvc接收对象数组 通过ajax提交
ajax代码 var obj = {}; obj.RoomName = ""; obj.RoomCode = ""; $.ajax({ type: " ...
- C语言 typedef struct _STUDENT {}STUDENT,*PSTUDENT;
#include <stdio.h> #include <stdlib.h> #include <string.h> //给stuct _STUDENT 起一个别名 ...