Submission #470715

#TimeUsernameProblemLanguageResultExecution timeMemory
470715dooompyMecho (IOI09_mecho)C++17
100 / 100
225 ms5552 KiB
#include "bits/stdc++.h"

using namespace std;

using ll = long long;

bool tree[1005][1005];
int bees[1005][1005];
bool seen[1005][1005];
int n, s, sx, sy, dx, dy;

int mx[]{1, -1, 0, 0};
int my[]{0, 0, 1, -1};

struct bear {
    int x, y, time, move;
};

bool able(int time) {
    fill(&seen[0][0], &seen[0][0] + sizeof(seen) / sizeof(seen[0][0]), false);
    int curtime = time;

    // curtime can go into curtime+2 but must finish on curtime+3

    queue<bear> q;
    q.push({sx, sy, curtime+2, 0});
//    seen[sx][sy] = true;

    if (bees[sx][sy] < curtime + 2) return false;

    while (!q.empty()) {
        auto cur = q.front(); q.pop();

        if (cur.x == dx && cur.y == dy) return true;


        if (seen[cur.x][cur.y]) continue;

        if (cur.move == s) {
            cur.time++;
            if (bees[cur.x][cur.y] < cur.time) {
                continue;
            }
            cur.move = 0;
        }

        if (bees[cur.x][cur.y] < cur.time) {
            continue;
        }



        seen[cur.x][cur.y] = true;

        for (int i = 0; i < 4; i++) {
            int newx = cur.x + mx[i], newy = cur.y + my[i];

            if (newx < 0 || newx >= n || newy < 0 || newy >= n || ((newx != dx && newy != dy) && bees[newx][newy] < cur.time) || tree[newx][newy] || seen[newx][newy]) continue;

            q.push({newx, newy, cur.time, cur.move+1});
        }
    }

    return false;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
//    freopen("", "r", stdin);
//    freopen("", "w", stdout);
    cin >> n >> s;
    queue<pair<int, int>> q;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            char c; cin>> c;
            if (c == 'T') tree[i][j] = true;
            if (c == 'M') {
                sx = i; sy = j;

            }
            if (c == 'D') {
                dx = i; dy = j;
            }
            if (c == 'H') {
                q.push({i, j});
                bees[i][j] = 1;
            }
        }
    }

    while (!q.empty()) {
        auto cur = q.front();
        q.pop();

        for (int i = 0; i < 4; i++) {
            int newx = cur.first + mx[i], newy = cur.second + my[i];
            if (newx < 0 || newx >= n || newy < 0 || newy >= n || bees[newx][newy] || tree[newx][newy] || (newx == dx && newy == dy)) continue;
            bees[newx][newy] = bees[cur.first][cur.second] + 1;
            q.push({newx, newy});
        }
    }

    int lo = 0, hi = 1e9;

    int biggest = -1;

    while (lo <= hi) {
        int mid = (lo + hi) / 2;
        if (able(mid)) {
            biggest = mid;
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    cout << biggest;

}
#Verdict Execution timeMemoryGrader output
Fetching results...