제출 #689508

#제출 시각아이디문제언어결과실행 시간메모리
689508tcmmichaelb139Mecho (IOI09_mecho)C++17
11 / 100
56 ms4420 KiB
#include "bits/stdc++.h"
using namespace std;

const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

struct node {
    int x, y;
    int mx;
    int step;
    int dist;
};

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, s;
    cin >> n >> s;
    vector<vector<char>> ar(n, vector<char>(n));
    pair<int, int> start, end;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            cin >> ar[i][j];
            if (ar[i][j] == 'M')
                start = {i, j};
            else if (ar[i][j] == 'D')
                end = {i, j};
        }

    auto bee_dist_gen = [&]() {
        vector<vector<int>> dist(n, vector<int>(n, 1e9));
        queue<pair<int, int>> q;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (ar[i][j] == 'H')
                    q.push({i, j}), dist[i][j] = 0;

        while (!q.empty()) {
            pair<int, int> v = q.front();
            q.pop();

            for (int i = 0; i < 4; i++) {
                int nx = v.first + dx[i], ny = v.second + dy[i];
                if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
                if (ar[nx][ny] == 'T') continue;
                if (dist[nx][ny] <= dist[v.first][v.second] + 1) continue;

                dist[nx][ny] = dist[v.first][v.second] + 1;
                q.push({nx, ny});
            }
        }

        return dist;
    };

    vector<vector<int>> bee_dist = bee_dist_gen();

    vector<vector<bool>> vis(n, vector<bool>(n, false));

    queue<node> q;
    q.push({start.first, start.second, bee_dist[start.first][start.second], 0, 0});
    vis[start.first][start.second] = true;

    int ans = 0;

    while (!q.empty()) {
        node v = q.front();
        q.pop();

        if (end.first == v.x && end.second == v.y)
            ans = max(ans, v.mx);

        if (v.step == 0)
            v.dist++;
        for (int i = 0; i < 4; i++) {
            int nx = v.x + dx[i], ny = v.y + dy[i];
            if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue;
            if (ar[nx][ny] == 'T') continue;
            if (bee_dist[nx][ny] < v.dist) continue;
            if (vis[nx][ny]) continue;
            vis[nx][ny] = true;

            q.push({nx, ny, min(v.mx, bee_dist[nx][ny] - v.dist), (v.step + 1) % s, v.dist});
        }
    }
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...