제출 #622887

#제출 시각아이디문제언어결과실행 시간메모리
622887fabijan_cikacAwesome Arrowland Adventure (eJOI19_adventure)C++17
100 / 100
96 ms33204 KiB
#include <bits/stdc++.h>

using namespace std;

#define pp pair<int, int>
#define F first
#define S second

const int N = 510;
const int INF = 1e9;

int n, m;
char a[N][N];
vector<pp> v[N * N];
set<pp> s; int dist[N * N];
int gd[N][N] = { 0 };

int lab(int x, int y){
    return (x * m + y);
}

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

    cin >> n >> m;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            cin >> a[i][j];
            if (a[i][j] != 'X' || (i == n - 1 && j == m - 1))
                gd[i][j] = 1;
        }
    }
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            if (a[i][j] == 'X') continue;
            vector<int> d(4);
            if (a[i][j] == 'N')
                d = {0, 1, 2, 3};
            else if (a[i][j] == 'E')
                d = {3, 0, 1, 2};
            else if (a[i][j] == 'S')
                d = {2, 3, 0, 1};
            else d = {1, 2, 3, 0};
            if (j + 1 < m && gd[i][j + 1])
                v[lab(i, j)].push_back({d[1], lab(i, j + 1)});
            if (j - 1 >= 0 && gd[i][j - 1])
                v[lab(i, j)].push_back({d[3], lab(i, j - 1)});
            if (i + 1 < n && gd[i + 1][j])
                v[lab(i, j)].push_back({d[2], lab(i + 1, j)});
            if (i - 1 >= 0 && gd[i - 1][j])
                v[lab(i, j)].push_back({d[0], lab(i - 1, j)});
        }
    }
    for (int i = 0; i < N * N; ++i)
        dist[i] = INF;
    dist[0] = 0; s.insert({0, 0});
    int bio[N * N] = { 0 };
    while (!s.empty()){
        auto it = s.begin();
        int x = (*it).S;
        if (bio[x]){
            s.erase(it); continue;
        }
        dist[x] = (*it).F;
        if (x == lab(n - 1, m - 1)) break;
        bio[x] = 1; s.erase(it);
        for (pp y: v[x]){
            if (dist[y.S] > dist[x] + y.F){
                dist[y.S] = dist[x] + y.F;
                s.insert({dist[y.S], y.S});
            }
        }
    }
    int val = dist[lab(n - 1, m - 1)];
    if (val != INF)
        cout << val;
    else cout << -1;

    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...