#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>> edges[250005];
map<char,int> mp;
const int inf=1e9;
int fark(char a,char b){
if(a=='X'){
return inf;
}
int tut=mp[b]-mp[a];
if(tut<0){
tut+=4;
}
return tut;
}
void solve(){
int n,m; cin >> n >> m;
char a[n+5][m+5];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(j<m-1){
edges[i*m+j].push_back({i*m+j+1,fark(a[i][j],'E')});
edges[i*m+j+1].push_back({i*m+j,fark(a[i][j+1],'L')});
}
if(i<n-1){
edges[i*m+j].push_back({(i+1)*m+j,fark(a[i][j],'S')});
edges[(i+1)*m+j].push_back({i*m+j,fark(a[i+1][j],'N')});
}
}
}
//cout << fark(a[0][0],'E') << " " << mp['E'] << endl;
priority_queue<int> q;
q.push(0);
vector<int> dp(250005,inf);
dp[0]=0;
while(!q.empty()){
int node=q.top(); q.pop();
for(auto u:edges[node]){
if(u.second==inf){
continue;
}
if(dp[u.first]>dp[node]+u.second){
//cout << dp[u.first] << " " << dp[node] << " " << u.second << endl;
q.push(u.first);
dp[u.first]=dp[node]+u.second;
}
}
}
/*for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout << dp[i*m+j] << " ";
}
cout << endl;
}*/
if(dp[n*m-1]==inf){
cout << -1 << endl;
}
else{
cout << dp[n*m-1] << endl;
}
}
int32_t main()
{
mp['N']=0;
mp['E']=1;
mp['S']=2;
mp['W']=3;
solve();
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... |