分析
BFS出到每一个点的(距离Limit)最短路径
将收到的宝藏sort+unique
然后再暴力max一下,即可
代码
//Newcoder 18 C
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
const LL MAXN=1e3+10;
LL Row,Line,Ans,Test;
LL Cube[MAXN][MAXN],Stax,Stay,Dist,Limit;
bool Vis[MAXN][MAXN],Jud[MAXN][MAXN];
LL Num[1000010],Cnt,Dep[MAXN][MAXN];
LL Dx[5]={0,0,-1,0,1},Dy[5]={0,1,0,-1,0};
struct Node { LL E,F; };
queue<Node>Temp;
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline void BFS() {
Temp.push(Node{ Stax,Stay });
Vis[Stax][Stay]=true;
while(!Temp.empty()) {
Node New=Temp.front();
Temp.pop();
if(Cube[New.E][New.F]>0) Num[++Cnt]=Cube[New.E][New.F];
if(Dep[New.E][New.F]>=Dist) continue;
FOR(i,1,4) {
LL Nx=New.E+Dx[i],Ny=New.F+Dy[i];
if(Nx>Row || Nx<1 || Ny>Line || Ny<1 || Vis[Nx][Ny]) continue;
Dep[Nx][Ny]=Dep[New.E][New.F]+1;
Vis[Nx][Ny]=true;
Temp.push(Node{ Nx,Ny });
}
}
}
inline void Solve() {
sort(Num+1,Num+Cnt+1);
LL Size=unique(Num+1,Num+Cnt+1)-(Num+1);
if(Size<Limit) { printf("no\n"); }
else {
FOR(i,1,Size-Limit+1)
Ans=min(Ans,Num[i+Limit-1]-Num[i]);
printf("%lld\n",Ans);
}
}
int main() {
//File();
scanf("%lld",&Test);
while(Test--) {
Cl(Num,0); Cnt=0;
Cl(Vis,false); Cl(Cube,0);
Ans=INF; Cl(Dep,0); Cl(Jud,false);
while(!Temp.empty()) Temp.pop();
scanf("%lld %lld %lld %lld %lld %lld",&Row,&Line,&Stax,&Stay,&Dist,&Limit);
FOR(i,1,Row) FOR(j,1,Line) {
scanf("%lld",&Cube[i][j]);
if(Cube[i][j]==-1) Vis[i][j]=true;
}
if(Cube[Stax][Stay]==-1) { cout<<"no"<<endl; continue; }
BFS();
Solve();
}
//fclose(stdin); fclose(stdout);
// system("pause");
return 0;
} 
京公网安备 11010502036488号