제출 #592172

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

typedef long long ll;

using namespace std;

const ll maxN = 510;

ll n, m, dist[maxN][maxN];
string s[maxN];

ll solve(){

    for(int i = 0; i < maxN; i++){
        for(int x = 0; x < maxN; x++){
            dist[i][x]=-1;
        }
    }

    dist[0][0] = -1;
    priority_queue<pair<int, pair<ll, ll>>, vector<pair<int, pair<ll, ll>>>, greater<pair<int, pair<ll, ll>>>> q;
    q.push({0, {0, 0}});

    while (!q.empty()) {
        pair<int, pair<ll, ll>> v = q.top();
        q.pop();
        ll w = v.first;
        ll i = v.second.first;
        ll x = v.second.second;
        if(i<0||x<0||i>=n||x>=m)continue;
        if (dist[i][x]==-1) {
            dist[i][x]=w;
            if(s[i][x]=='X')continue;
            if(s[i][x]=='N'){
                q.push({dist[i][x], {i-1, x}});
                q.push({dist[i][x]+1, {i, x+1}});
                q.push({dist[i][x]+2, {i+1, x}});
                q.push({dist[i][x]+3, {i, x-1}});
            }
            if(s[i][x]=='E'){
                q.push({dist[i][x]+3, {i-1, x}});
                q.push({dist[i][x], {i, x+1}});
                q.push({dist[i][x]+1, {i+1, x}});
                q.push({dist[i][x]+2, {i, x-1}});
            }
            if(s[i][x]=='S'){
                q.push({dist[i][x]+2, {i-1, x}});
                q.push({dist[i][x]+3, {i, x+1}});
                q.push({dist[i][x], {i+1, x}});
                q.push({dist[i][x]+1, {i, x-1}});
            }
            if(s[i][x]=='W'){
                q.push({dist[i][x]+1, {i-1, x}});
                q.push({dist[i][x]+2, {i, x+1}});
                q.push({dist[i][x]+3, {i+1, x}});
                q.push({dist[i][x], {i, x-1}});
            }
        }
    }
    /*for(int i = 0; i < 4; i++){
        for(int x = 0; x < 4; x++){
            cout<<dist[i][x]<<" ";
        }
        cout<<endl;
    }*/
    return dist[n-1][m-1];
}

int main()
{

    cin>>n>>m;
    for(int i = 0; i < n; i++){
        cin>>s[i];
    }

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