Submission #1197943

#TimeUsernameProblemLanguageResultExecution timeMemory
1197943JooDdaeDangerous Skating (JOI16_skating)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int INF = 1e9;

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

int n, m, sx, sy, ex, ey, d[1010][1010][4], c[1010][1010][4];
string s[1010];
vector<queue<array<int, 4>>> Q(3);

void add(int sx, int sy, int i, int p) {
    if(d[sx][sy][i] <= 0) return;

    if(c[sx][sy][i] > p) c[sx][sy][i] = p, Q[p%3].push({p, sx, sy, i});
    int x = sx + dx[i]*d[sx][sy][i], y = sy + dy[i]*d[sx][sy][i];
    if(c[x][y][i^1] > p+1) c[x][y][i^1] = p+1, Q[(p+1)%3].push({p+1, x, y, i^1});
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    for(int i=0;i<n;i++) cin >> s[i];
    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<4;k+=2) d[i][j][k] = s[i-1][j-1] == '#' ? -1 : d[i+dx[k]][j+dy[k]][k]+1;
    for(int i=n;i>=1;i--) for(int j=m;j>=1;j--) for(int k=1;k<4;k+=2) d[i][j][k] = s[i-1][j-1] == '#' ? -1 : d[i+dx[k]][j+dy[k]][k]+1;

    cin >> sx >> sy >> ex >> ey;
    if(sx == ex && sy == ey) return cout << 0, 0;

    for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<4;k++) c[i][j][k] = INF;
    for(int i=0;i<4;i++) add(sx, sy, i, 1);

    int flag = 1;
    while(flag--) {
        for(auto &q : Q) while(!q.empty()) {
            auto [p, x, y, d] = q.front(); q.pop();
            if(c[x][y][d] < p) continue;
            if(x == ex && y == ey) return cout << p-1, 0;

            flag = 1;

            int xx = x+dx[d], yy = y+dy[d], P = p+2;
            if(c[xx][yy][d] > P) Q[P%3].push({P, xx, yy, d}), c[xx][yy][d] = P;
            for(int i=0;i<2;i++) add(x, y, d^2^i, p);
        }
    }

    cout << -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...