Submission #1181511

#TimeUsernameProblemLanguageResultExecution timeMemory
1181511zadniprovskaAwesome Arrowland Adventure (eJOI19_adventure)C++20
50 / 100
2094 ms1160 KiB
#include <bits/stdc++.h>

using namespace std;

#define el '\n'
#define ll long long
#define ld long double
#define ull unsigned long long
#define pll pair<long long, long long>
#define ppll pair< long long, pair<long long, long long> >
#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define all(x) x.begin(), x.end()

const ll DIM = 507;
const ll INF = 1e18;
const ll mod = 1e9 + 7;
const ll maxlog = 20;

ll dist[DIM][DIM], a[DIM][DIM];
priority_queue<ppll> q;

const vector<ll> dx {-1, 0, 1, 0};
const vector<ll> dy {0, 1, 0, -1};

void solve() {

    ll n, m;
    cin >> n >> m;

    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++) {
            char ch;
            cin >> ch;

            if (ch == 'N') a[i][j] = 0;
            else if (ch == 'E') a[i][j] = 1;
            else if (ch == 'S') a[i][j] = 2;
            else if (ch == 'W') a[i][j] = 3;
            else a[i][j] = -1;

            dist[i][j] = INF;
        }
    }

    if (a[1][1] == -1) {
        cout << -1 << el;
        return;
    }

    dist[1][1] = 0;
    q.push({0, {1, 1}});
    while (!q.empty()) {

        ll x = q.top().ss.ff, y = q.top().ss.ss;
        q.pop();

        for (int t=0; t<4; t++) {

            ll nx = x + dx[(a[x][y]+t)%4], ny = y + dy[(a[x][y]+t)%4];
            if (nx < 1 || nx > n || ny < 1 || ny > m || (a[nx][ny] == -1 && (nx != n || ny != m)) ) continue;

            if (dist[nx][ny] > dist[x][y] + t) {
                dist[nx][ny] = dist[x][y] + t;

                q.push({dist[nx][ny], {nx, ny}});
            }
        }

    }

    if (dist[n][m] == INF) cout << -1 << el;
    else cout << dist[n][m] << el;


}



signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    //freopen("nocross.in", "r", stdin);
    //freopen("nocross.out", "w", stdout);

    int ntest = 1;
    //cin >> ntest;
    while (ntest--){
        solve();
    }
    return 0;

}
;
#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...