牛客IOI周赛18-普及组 C:智斗恶龙 —— bfs详解

博客介绍了IOI竞赛中C题的解题过程,主要涉及使用BFS算法寻找在给定地图上,通过不超过特定步数,收集至少指定数量不同宝藏的能力值,确保能力值差最小。解题关键在于利用BFS遍历地图,将能力值存储在集合中,并考虑如何选择使最大值和最小值差值最小的宝藏组合。完整代码包含详细注释。
摘要由CSDN通过智能技术生成

传送门
在这里插入图片描述
示例1:

输入

3
3 3 1 1 3 3
0 1 2
1 0 3
0 2 3
3 3 1 1 3 3
0 1 2
-1 0 -1
2 0 2
3 3 1 1 3 1
0 1 2
-1 1 -1
2 0 2

输出

2
no
0

说明:
对于第一组数据,可以发现MoveToEx能到达除了(3,3)之外的所有格子,所以他得到的宝藏能力分别为[1,1,2,2,3],所以他可以使用能力值为1 2 3的宝藏,此时使用宝藏的能力值之差为2.
对于第二组数据,可以发现MoveToEx能获得的宝藏能力分别为[1,2],而打倒巨龙需要3种不同的宝藏,所以不能打倒巨龙
对于第三组数据,可以发现MoveToEx获得的宝藏能力分别为[1,1,2],他可以使用任意一种宝藏,能力值之差为0

题意:在给定地图中走不超过d步,找到个数不小于x种不同的宝藏能力值,并且保证最大值和最小值的差值最小

解题思路:先用bfs将图能存的能力值都存入set容器中,最后在所有的能力值找到最大值和最小值差值最小的x个能力值。
要注意的是,visited数组不能全部清空,用一个pair将走过的点坐标存起来,最后利用pair存储的坐标来清空visited
其余详见注释

完整代码

#include <iostream>
#include <queue>
#include <set>

using namespace std;
typedef long long ll;
const int N = 1e3 + 10;
int k,g;
int n,m,sx,sy,d,x;
ll maze[N][N]/*存地图*/,power[N*N]/*存能量值*/;
int dir[4][2] = {
   {
   1,0}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值