#include <iostream>
#include <vector>
#include <utility>
#include <queue>
#include <cassert>
using namespace std;
const int INF = 10000000;
int n,s;
int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
char mat[805][805];
vector<pair<int,int>> hives;
int homei,homej;
int starti,startj;
int bee_dist[805][805],mecho_dist[805][805];
bool validbee(int x,int y) {
if (!(x>=1&&x<=n&&y>=1&&y<=n))
return false;
if (mat[x][y]=='G'||mat[x][y]=='M')
return true;
return false;
}
bool validmecho(int x,int y) {
if (!(x>=1&&x<=n&&y>=1&&y<=n))
return false;
if (mat[x][y]=='T'||mat[x][y]=='H')
return false;
return true;
}
bool beforebee(int x,int y,int dist,int offset) {
if (dist/s+offset<bee_dist[x][y])
return true;
return false;
}
void reset() {
for (int i = 1;i<=n;++i) {
for (int j = 1;j<=n;++j) {
mecho_dist[i][j] = INF;
}
}
}
bool reachable(int tiempo) {
reset();
queue<pair<int,int>> q;
q.emplace(starti,startj);
mecho_dist[starti][startj] = 0;
while(!q.empty()) {
auto crt = q.front();
q.pop();
int x = crt.first,y = crt.second;
for (int k = 0;k<4;++k) {
int crtx = x+dx[k],crty = y+dy[k];
if (validmecho(crtx,crty)&&crtx==homei&&crty==homej) {
return true;
}
if (validmecho(crtx,crty)&&mecho_dist[x][y]+1<mecho_dist[crtx][crty]&&beforebee(crtx,crty,mecho_dist[x][y]+1,tiempo)) {
q.emplace(crtx,crty);
mecho_dist[crtx][crty] = mecho_dist[x][y]+1;
}
}
}
return false;
}
int main() {
cin>>n>>s;
for (int i = 1;i<=n;++i) {
for (int j = 1;j<=n;++j) {
bee_dist[i][j] = INF;
mecho_dist[i][j] = INF;
cin>>mat[i][j];
if (mat[i][j]=='H') {
hives.emplace_back(i,j);
} else if (mat[i][j]=='D') {
homei = i;
homej = j;
} else if (mat[i][j]=='M') {
starti = i;
startj = j;
}
}
}
queue<pair<int,int>> q;
for (const auto &[f,s] : hives) {
q.emplace(f,s);
bee_dist[f][s] = 0;
}
// bee bfs
while(!q.empty()) {
auto crt = q.front();
q.pop();
int x = crt.first,y = crt.second;
for (int k = 0;k<4;++k) {
int crtx = x+dx[k],crty = y+dy[k];
if (validbee(crtx,crty)&&bee_dist[x][y]+1<bee_dist[crtx][crty]) {
bee_dist[crtx][crty] = bee_dist[x][y]+1;
q.emplace(crtx,crty);
}
}
}
// queue should be empty
assert(q.empty());
// now lets bfs for mecho
// l is always safe, r is never safe;
// l<=x,r >x
// find max good x
int l = -1,r = 10000000;
while(l+1!=r) {
int mid = (l+r)/2;
if (reachable(mid)) {
l = mid;
} else {
r = mid;
}
}
cout<<l;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |