#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |