Submission #1357075

#TimeUsernameProblemLanguageResultExecution timeMemory
1357075guardianecMaze (JOI23_ho_t3)C++20
100 / 100
463 ms169676 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll r,c,n;
ll calc(ll i, ll j) {
    return i*c+j;
}

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

    cin >> r >> c >> n;
    ll s1,s2,g1,g2;
    cin >> s1 >> s2 >> g1 >> g2;
    s1--; s2--; g1--; g2--;

    vector<string> a(r);
    for (int i=0; i<r; i++) {
        cin >> a[i];
    }

    vector<ll> dist(r*c, 1e18);
    vector<ll> dist1(r*c, 1e18);

    deque<ll> dq, sq;
    dq.push_front(calc(s1, s2));
    dist[calc(s1,s2)] = 0;
    dist1[calc(s1,s2)]=0;
    sq.push_back(calc(s1,s2));

    vector<ll> di = {-1, 1, 0, 0};
    vector<ll> dj = {0, 0, -1, 1};
    vector<ll> di1 = {-1, -1, -1, 0, 0, 1, 1, 1};
    vector<ll> dj1 = {-1, 0, 1, -1, 1, -1, 0, 1};
    ll d = 0;
    while(!dq.empty()) {
        if (dist[calc(g1,g2)]<=d) break;
        while(!dq.empty() && dist[dq.front()]==d) {
            ll u = dq.front();
            dq.pop_front();
            ll i = u/c; ll j = u%c;

            if (dist1[u]>0) {
                dist1[u] = 0;
                sq.push_back(u);
            }

            for (int idx=0; idx<4; idx++) {
                ll i1 = i+di[idx];
                ll j1 = j+dj[idx];
                if (i1>=0 && i1<r && j1>=0 && j1<c) {
                    ll pos = i1*c+j1;
                    if (a[i1][j1]=='.' && dist[pos]>d) {
                        dist[pos] = d;
                        dq.push_front(pos);
                    }

                    if (dist1[pos]>0) {
                        dist1[pos] = 0;
                        sq.push_back(pos);
                    }
                }
            }
        }

        while(!sq.empty()) {
            ll u = sq.front();
            sq.pop_front();
            ll i = u/c; ll j = u%c;

            if (dist[u] > d + 1) {
                dist[u] = d + 1;
                dq.push_back(u);
            }

            if (dist1[u]>=n-1) continue;

            for (int idx=0; idx<8; idx++) {
                ll i1 = i+di1[idx];
                ll j1 = j+dj1[idx];
                if (i1>=0 && i1<r && j1>=0 && j1<c) {
                    ll v = i1*c+j1;
                    if (dist1[v]>dist1[u]+1) {
                        dist1[v] = dist1[u]+1;
                        sq.push_back(v);
                    }
                }
            }
        }
        d++;
    }

    cout << dist[calc(g1,g2)] << "\n";
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...