#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define sp <<" "<<
#define endl "\n"
int dr[4] = {0, 0, -1, 1};
int dc[4] = {-1, 1, 0, 0};
void solve() {
int n, s; cin >> n >> s;
vector<string> grid(n);
for (int i = 0; i < n; i++) {
cin >> grid[i];
}
auto check = [&](int cap) -> bool {
vector<vector<bool>> blocked(n, vector<bool>(n));
vector<vector<int>> dist(n, vector<int>(n, 1e9));
using state = tuple<int, int, int>;
queue<state> p, q;
state start;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 'H') {
q.emplace(i, j, 0);
blocked[i][j] = true;
dist[i][j] = 0;
}
if (grid[i][j] == 'M') {
start = make_tuple(i, j, 0);
}
}
}
auto in = [&](int rr, int cc) -> bool {
return (0 <= rr and rr < n and 0 <= cc and cc < n);
};
while (!q.empty()) {
auto [r, c, d] = q.front(); q.pop();
for (int i = 0; i < 4; i++) {
int nr = r + dr[i], nc = c + dc[i];
if (in(nr, nc) and !blocked[nr][nc]) {
if (grid[nr][nc] == 'M') {
blocked[nr][nc] = true;
if (d+1 <= cap) {
return false;
}
} else if (grid[nr][nc] == 'G') {
if (d+1 > cap) {
p.emplace(nr, nc, 1);
dist[nr][nc] = 1;
} else {
q.emplace(nr, nc, d+1);
blocked[nr][nc] = true;
dist[nr][nc] = 0;
}
}
}
}
}
while (!p.empty()) {
auto [r, c, d] = p.front(); p.pop();
for (int i = 0; i < 4; i++) {
int nr = r + dr[i], nc = c + dc[i];
if (in(nr, nc) and d+1 < dist[nr][nc] and grid[nr][nc] == 'G') {
dist[nr][nc] = d+1;
p.emplace(nr, nc, d+1);
}
}
}
q.push(start);
while (!q.empty()) {
auto [r, c, d] = q.front(); q.pop();
if (d > 0 and d % s == 0) {
queue<int> oth;
}
for (int i = 0; i < 4; i++) {
int nr = r + dr[i], nc = c + dc[i];
if (in(nr, nc) and !blocked[nr][nc]) {
if (grid[nr][nc] == 'D') {
return true;
} else if (grid[nr][nc] == 'G' and (d+1) / s < dist[nr][nc]) {
q.emplace(nr, nc, d+1);
blocked[nr][nc] = true;
}
}
}
}
return false;
};
int lo = -1, hi = n * n;
while (hi - lo > 1) {
int mid = (lo + hi) / 2;
if (!check(mid)) {
hi = mid;
} else {
lo = mid;
}
}
if (!check(hi)) hi = lo;
cout << hi << endl;
}
signed main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
int t = 1;
// cin >> t;
while (t--)
solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |