제출 #868183

#제출 시각아이디문제언어결과실행 시간메모리
868183marizaAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
81 ms19400 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

#define N 200001
#define INF 1000000001

#define MID ((l+r)/2)
#define RANGE (r-l+1)

int main() {
    ll n, m;
    cin>>n>>m;

    char c;
    ll u[n][m], r[n][m], d[n][m], l[n][m];
    for(ll i=0; i<n; i++){
        for(ll j=0; j<m; j++){
            cin>>c;
            if(c=='N'){
                u[i][j]=0;
                r[i][j]=1;
                d[i][j]=2;
                l[i][j]=3;
            }
            else if(c=='E'){
                u[i][j]=3;
                r[i][j]=0;
                d[i][j]=1;
                l[i][j]=2;
            }
            else if(c=='S'){
                u[i][j]=2;
                r[i][j]=3;
                d[i][j]=0;
                l[i][j]=1;
            }
            else if(c=='W'){
                u[i][j]=1;
                r[i][j]=2;
                d[i][j]=3;
                l[i][j]=0;
            }
            else{
                u[i][j]=INF;
                r[i][j]=INF;
                d[i][j]=INF;
                l[i][j]=INF;
            }
            if(i==0){
                u[i][j]=INF;
            }
            else if(i==n-1){
                d[i][j]=INF;
            }
            if(j==0){
                l[i][j]=INF;
            }
            else if(j==m-1){
                r[i][j]=INF;
            }
        }
    }

    priority_queue <pair<ll,pair<ll,ll>>> q; q.push({0,{0,0}});
    ll dist[n][m];
    for(ll i=0; i<n; i++){
        for(ll j=0; j<m; j++){
            dist[i][j]=INF;
        }
    }
    dist[0][0]=0;
    ll pr[n][m]={};

    while(!q.empty()){
        ll i=q.top().second.first;
        ll j=q.top().second.second;
        q.pop();

        if(pr[i][j]){
            continue;
        }
        pr[i][j]=true;

        if(i>0 && dist[i][j]+u[i][j]<dist[i-1][j]){
            dist[i-1][j]=dist[i][j]+u[i][j];
            q.push({-(dist[i][j]+u[i][j]),{i-1,j}});
        }
        if(i<n-1 && dist[i][j]+d[i][j]<dist[i+1][j]){
            dist[i+1][j]=dist[i][j]+d[i][j];
            q.push({-(dist[i][j]+d[i][j]),{i+1,j}});
        }
        if(j>0 && dist[i][j]+l[i][j]<dist[i][j-1]){
            dist[i][j-1]=dist[i][j]+l[i][j];
            q.push({-(dist[i][j]+l[i][j]),{i,j-1}});
        }
        if(j<m-1 && dist[i][j]+r[i][j]<dist[i][j+1]){
            dist[i][j+1]=dist[i][j]+r[i][j];
            q.push({-(dist[i][j]+r[i][j]),{i,j+1}});
        }
//        for(ll i1=0; i1<n; i1++){
//            for(ll j1=0; j1<m; j1++){
//                cout<<setw(3)<<((dist[i1][j1]<INF)?dist[i1][j1]:-1);
//            }
//            cout<<endl;
//        }
//        cout<<endl<<q.top().first<<" "<<q.top().second.first<<" "<<q.top().second.second<<endl;
    }


    cout<<((dist[n-1][m-1]<INF)?dist[n-1][m-1]:-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...