传送门
示例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}