Submission #1295209

#TimeUsernameProblemLanguageResultExecution timeMemory
1295209marizaAwesome Arrowland Adventure (eJOI19_adventure)C++20
0 / 100
1 ms572 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll INF=1e18;

int main(){
    ll n, m;
    cin>>n>>m;
    string a[n];
    for(ll i=0; i<n; i++){
        cin>>a[i];
    }

    vector<pair<ll,ll>> g[n*m];  // Cell (i,j) is node n*i+j
    for(ll i=0; i<n; i++){
        for(ll j=0; j<m; j++){
            if(a[i][j]=='N'){
                if(0<i) g[m*i+j].push_back({m*(i-1)+j,0});
                if(j<m-1) g[m*i+j].push_back({m*i+j+1,1});
                if(i<n-1) g[m*i+j].push_back({m*(i+1)+j,2});
                if(0<j) g[m*i+j].push_back({m*i+j-1,3});
            }
            else if(a[i][j]=='E'){
                if(0<i) g[m*i+j].push_back({m*(i-1)+j,3});
                if(j<m-1) g[m*i+j].push_back({m*i+j+1,0});
                if(i<n-1) g[m*i+j].push_back({m*(i+1)+j,1});
                if(0<j) g[m*i+j].push_back({m*i+j-1,2});
            }
            else if(a[i][j]=='S'){
                if(0<i) g[m*i+j].push_back({m*(i-1)+j,2});
                if(j<m-1) g[m*i+j].push_back({m*i+j+1,3});
                if(i<n-1) g[m*i+j].push_back({m*(i+1)+j,0});
                if(0<j) g[m*i+j].push_back({m*i+j-1,1});
            }
            else if(a[i][j]=='W'){
                if(0<i) g[m*i+j].push_back({m*(i-1)+j,1});
                if(j<m-1) g[m*i+j].push_back({m*i+j+1,2});
                if(i<n-1) g[m*i+j].push_back({m*(i+1)+j,3});
                if(0<j) g[m*i+j].push_back({m*i+j-1,0});
            }
        }
    }

    ll dist[n*m];
    dist[0]=0;
    for(ll i=1; i<n*m; i++){
        dist[i]=INF;
    }

    bool vis[n*m]={};

    priority_queue<pair<ll,ll>> q;
    q.push({0,0});

    while(!q.empty()){
        ll curr=q.top().second; q.pop();

        if(vis[curr]) continue; 
        vis[curr]=1;

        for(auto nxt:g[curr]){
            if(dist[curr]+nxt.second<dist[nxt.first]){
                dist[nxt.first]=dist[curr]+nxt.second;
                q.push({-dist[nxt.first],nxt.first});
            }
        }
    }

    cout<<dist[n*m-1]<<endl;
}
#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...