题解 【洛谷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号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
随机推荐
- Java 8 函数式编程
今天打开Oracle Java官网一看,Java已经更新到 13 了 https://www.oracle.com/technetwork/java/javase/jdk-relnotes-index ...
- 源码编译安装python2/3版本
1- 源码编译安装python2.7版本 1.1- 下载源码包 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz 1.2- ...
- select下拉框相关操作(更新中。。。)
背景 记录一些关于html标签的操作,基本上都是jquery操作 select下拉框 根据value查找对应option,然后执行选中操作 $("#selectId").find( ...
- QQ常用表情
以下表情均为QQ官方表情原图,版权归QQ所有,禁止用于商业用途.  ![3nEaFJ.p ...
- JAVA类变量、类方法
类变量(static) 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. public class C { ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hbase微博案例
实验目的 熟悉hbase表格设计的方法 熟悉hbase的javaAPI 通过API理解掌握hbase的数据的逻辑视图 了解MVC的服务端设计方式 实验原理 上次我们已经初步设计了学生选课案例的,具体功 ...
- JN_0013:win10快速回桌面
4.最后一种方法是最为实用的方法.按快捷键[windows键+D键],如下图所示,两键同时按,或者先按住windows键不放再按D键.这种方法在任何时候都是有用的,并且熟练使用后可以达到非常快的速度: ...
- c++编程之内存模型
我们在编程的时候,无可避免要申明变量,在这个变量可以是在()中,可以在{}中,也可以直接在外面,也可以用new的方式.那么当我们在申明变量的时候,实质上我们所做的工作是:关联了一个内存模型! 上代码: ...
- 再访JavaScript对象(原型链和闭包)
一:原型链简介 JavaScript通常被描述为基于原型的语言 (从继承机制的角度)- 为了提供继承,对象(注意:区别于实例)可以拥有一个原型对象,它充当一个模板对象,它继承了方法和属性.对象的原型对 ...
- ng-简介
Angular 是什么 Angular(读音['æŋgjʊlə])是一套用于构建用户界面的 JavaScript 框架.由 Google 开发和维护,主要被用来开发单页面应用程序. 类似于 Vue.j ...