169392025-05-16 16:56:07tomi7Fantasztikus Kaland Nyílországbancpp17Accepted 100/100163ms22380 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
#include <queue>
using namespace std;

const int INF=1e9;

int main() {
	int n, m;cin>>n>>m;
    vector<vector<int>> a(n, vector<int> (m, -1));
    vector<vector<array<int, 2>>> elek(n*m);
    int hihi=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            char c;
            cin>>c;
            if(c=='S'){
                a[i][j]=0;
            }else if(c=='N'){
                a[i][j]=2;
            }else if(c=='W'){
                a[i][j]=3;
            }else if(c=='E'){
                a[i][j]=1;
            }
   //         cout<<a[i][j]<<' ';
        }
    //    cout<<endl;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(a[i][j]==-1){hihi++; continue;}
            if(i!=0){
                if(a[i][j]!=-1){
                    int hhhh=a[i][j];
                    if(a[i][j]<2){
                        a[i][j]+=4;
                    }
                    elek[hihi].push_back({abs(a[i][j]-2), hihi-m});
                    a[i][j]=hhhh;
                }
            }
            if(i!=n-1){
                if(a[i][j]!=-1){
                    elek[hihi].push_back({abs(a[i][j]-0), hihi+m});
                }
            }
            if(j!=0){
                if(a[i][j]!=-1){
                    int hhhh=a[i][j];
                    if(a[i][j]<3){
                        a[i][j]+=4;
                    }
                    elek[hihi].push_back({abs(a[i][j]-3), hihi-1});
                    a[i][j]=hhhh;
                }
            }
            if(j!=m-1){
                if(a[i][j]!=-1){
                    int hhhh=a[i][j];
                    if(a[i][j]<1){
                        a[i][j]+=4;
                    }
                    elek[hihi].push_back({abs(a[i][j]-1), hihi+1});
                    a[i][j]=hhhh;
                }
            }
            hihi++;
        }
    }
    /*for(int i=0;i<n*m;i++){
        for(auto[x, y]: elek[i]){
            cout<<i<<' '<<y<<' '<<x<<'\n';
        }
    }*/
    priority_queue<array<int, 2>> q;
    vector<int> dist(n*m, INF);
    vector<bool> vis(n*m, false);
    dist[0]=0;
    q.push({0, 0});
    while(!q.empty()){
        int x=q.top()[0], y=q.top()[1];
        if(vis[y]){
            q.pop();
            continue;
        }
        vis[y]=true;
        q.pop();
        for(auto[z, h]: elek[y]){
            if(dist[h]>dist[y]+z){
                dist[h]=dist[y]+z;
                q.push({-dist[h], h});
            }
        }
    }
    if(dist[n*m-1]==INF){
        cout<<-1<<'\n';
    }else{
        cout<<dist[n*m-1]<<'\n';
    }
}
SubtaskSumTestVerdictTimeMemory
subtask110/10
1Accepted1ms512 KiB
2Accepted1ms316 KiB
3Accepted1ms416 KiB
4Accepted1ms316 KiB
5Accepted1ms408 KiB
6Accepted1ms316 KiB
7Accepted1ms316 KiB
8Accepted1ms400 KiB
9Accepted1ms316 KiB
10Accepted1ms400 KiB
subtask212/12
1Accepted1ms380 KiB
2Accepted1ms404 KiB
3Accepted1ms564 KiB
4Accepted1ms404 KiB
5Accepted1ms412 KiB
6Accepted2ms512 KiB
7Accepted1ms316 KiB
8Accepted1ms316 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
subtask312/12
1Accepted1ms316 KiB
2Accepted1ms316 KiB
3Accepted1ms316 KiB
4Accepted1ms316 KiB
subtask416/16
1Accepted1ms404 KiB
2Accepted1ms316 KiB
3Accepted1ms316 KiB
4Accepted1ms404 KiB
5Accepted1ms316 KiB
6Accepted1ms404 KiB
7Accepted1ms404 KiB
8Accepted1ms328 KiB
9Accepted1ms404 KiB
10Accepted1ms316 KiB
subtask550/50
1Accepted13ms2028 KiB
2Accepted2ms400 KiB
3Accepted14ms2212 KiB
4Accepted12ms3136 KiB
5Accepted150ms17984 KiB
6Accepted146ms17940 KiB
7Accepted70ms17768 KiB
8Accepted138ms17976 KiB
9Accepted163ms22380 KiB
10Accepted70ms17780 KiB