#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>> edges[300005];
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(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
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],'W')});
}
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;
vector<int> dist(n*m, inf);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
dist[0] = 0;
pq.emplace(0, 0);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto [v, w] : edges[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.emplace(dist[v], v);
}
}
}
/*for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout << dp[i*m+j] << " ";
}
cout << endl;
}*/
if(dist[n*m-1]==inf){
cout << -1 << endl;
}
else{
cout << dist[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... |