#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define vec vector
#define pll pair<ll,ll>
#define fr first
#define sc second
#define dbg(x) cout<<#x<<" = "<<x<<endl
struct dt{
ll x,y,dist;
};
const vec<pll>off={{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0}};
const ll INF=LLONG_MAX;
ll n,m;
vec<vec<char>>g;
vec<vec<ll>>d;
bool chk(const ll x, const ll y){if(x<=0||x>n||y<=0||y>m)return false;return true;}
struct com{
bool operator()(const dt&a, const dt&b){
return a.dist>b.dist;
}
};
priority_queue<dt,vec<dt>,com>pq; // Djikstra algorithm
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
g=vec<vec<char>>(n+1,vec<char>(m+1));
d=vec<vec<ll>>(n+1,vec<ll>(m+1,INF));
for(ll i=1;i<=n;i++)for(ll j=1;j<=m;j++)cin>>g[i][j];
pq.push({1,1,0});
while(!pq.empty()){
dt cur=pq.top();pq.pop();
ll x=cur.x,y=cur.y,dist=cur.dist,offset; // Offset jika g[i][j]=='N'
if(d[x][y]<=dist)continue;d[x][y]=dist;
char dir=g[x][y];if(dir=='X')continue; // Ya gak usah dilanjutin
if(dir=='N')offset=0;
else if(dir=='E')offset=1;
else if(dir=='S')offset=2;
else if(dir='W')offset=3;
for(ll i=offset;i<offset+4;i++){
ll xx=x+off[i].fr;ll yy=y+off[i].sc; // Pergi kesebelahnya
if(!chk(xx,yy))continue; // Keluar dari map
if(d[xx][yy]>dist+i-offset)pq.push({xx,yy,dist+i-offset});
}
}
if(d[n][m]==INF)cout<<-1;else cout<<d[n][m];return 0;
}
# | 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... |