Submission #1357073

#TimeUsernameProblemLanguageResultExecution timeMemory
1357073guardianecMaze (JOI23_ho_t3)C++20
51 / 100
2095 ms28372 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)]=n-1;
    sq.push_back(calc(s1,s2));

    vector<ll> di = {-1, 1, 0, 0, -1, -1, 1, 1};
    vector<ll> dj = {0, 0, -1, 1, -1, 1, -1, 1};
    while(!dq.empty()) {
        ll u = dq.front();
        dq.pop_front();

        ll i = u/c; ll j = u%c;
        ll d = dist[u];
        ll s = dist1[u];

        if (d>dist[u] || (d==dist[u] && s>dist1[u])) continue;
        if (i==g1 && j==g2) break;

        if (s<n-1) {
            for (int idx=0; idx<8; idx++) {
                ll i1 = i+di[idx];
                ll j1 = j+dj[idx];
                if (i1>=0 && i1<r && j1>=0 && j1<c) {
                    ll v = calc(i1, j1);
                    if (dist[v]>d || (dist[v]==d && dist1[v]>s+1)) {
                        dist[v] = d;
                        dist1[v] = s+1;
                        dq.push_front(v);
                    }
                }
            }
        }

        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 v = calc(i1, j1);

                if (a[i1][j1]=='.') {
                    if (dist[v]>d || (dist[v]==d && dist1[v]>n-1)) {
                        dist[v] = d;
                        dist1[v] = n-1;
                        dq.push_front(v);
                    }
                }

                if (dist[v]>d+1 || (dist[v]==d+1 && dist1[v]>0)) {
                    dist[v] = d+1;
                    dist1[v] = 0;
                    dq.push_back(v);
                }
            }
        }
    }

    cout << dist[calc(g1,g2)];
}
#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...