Submission #1278359

#TimeUsernameProblemLanguageResultExecution timeMemory
1278359dostsMaze (JOI23_ho_t3)C++20
100 / 100
548 ms152232 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;

const int N = 1e5+1;

void solve() {
    int n,m,k;
    cin >> n >> m >> k;
    pii start,targ;
    cin >> start.ff >> start.ss;
    cin >> targ.ff >> targ.ss;
    start.ff--,start.ss--;
    targ.ff--,targ.ss--;
    vector<string> grid(n);
    for (auto& row : grid) cin >> row;
    queue<pii> q1;
    queue<pair<pii,pii>> q2;
    q1.push(start);
    vector<vi> dist(n,vi(m,inf));
    dist[start.ff][start.ss] = 0;
    vi dx = {1,0,-1,0},dy = {0,1,0,-1};

    auto cool = [&](int x,int y) -> bool {
        if (x >= n || x < 0) return 0;
        if (y >= m || y < 0) return 0;
        return 1;
    };
    while (!q1.empty()) {
        while (!q1.empty()) {
            auto [x,y] = q1.front();
            q1.pop();
            for (int i = 0;i<4;i++) {
                int gx = x+dx[i],gy = y+dy[i];
                if (!cool(gx,gy)) continue;
                if (dist[gx][gy] != inf) continue;
                if (grid[gx][gy] == '#') {
                    dist[gx][gy] = dist[x][y]+1;
                    q2.push({{gx,gy},{1,1}});
                }
                else {
                    dist[gx][gy] = dist[x][y];
                    q1.push({gx,gy});
                }
            }
        }

        while (!q2.empty()) {
            auto [cell,mv] = q2.front();
            q2.pop();
            auto [x,y] = cell;
            q1.push({x,y});
            auto [rx,ry] = mv;
            for (int i = 0;i<4;i++) {
                int gx = x+dx[i],gy = y+dy[i];
                int rrx = rx+abs(dx[i]),rry = ry+abs(dy[i]);
                if (!cool(gx,gy)) continue;
                if (dist[gx][gy] != inf) continue;
                if (rrx > k || rry > k) continue;
                dist[gx][gy] = dist[x][y];
                q2.push({{gx,gy},{rrx,rry}});
            }
        }
    }
    cout << dist[targ.ff][targ.ss] << '\n';
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...