169392025-05-16 16:56:07tomi7Fantasztikus Kaland Nyílországbancpp17Elfogadva 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';
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask110/10
1Elfogadva1ms512 KiB
2Elfogadva1ms316 KiB
3Elfogadva1ms416 KiB
4Elfogadva1ms316 KiB
5Elfogadva1ms408 KiB
6Elfogadva1ms316 KiB
7Elfogadva1ms316 KiB
8Elfogadva1ms400 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms400 KiB
subtask212/12
1Elfogadva1ms380 KiB
2Elfogadva1ms404 KiB
3Elfogadva1ms564 KiB
4Elfogadva1ms404 KiB
5Elfogadva1ms412 KiB
6Elfogadva2ms512 KiB
7Elfogadva1ms316 KiB
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
subtask312/12
1Elfogadva1ms316 KiB
2Elfogadva1ms316 KiB
3Elfogadva1ms316 KiB
4Elfogadva1ms316 KiB
subtask416/16
1Elfogadva1ms404 KiB
2Elfogadva1ms316 KiB
3Elfogadva1ms316 KiB
4Elfogadva1ms404 KiB
5Elfogadva1ms316 KiB
6Elfogadva1ms404 KiB
7Elfogadva1ms404 KiB
8Elfogadva1ms328 KiB
9Elfogadva1ms404 KiB
10Elfogadva1ms316 KiB
subtask550/50
1Elfogadva13ms2028 KiB
2Elfogadva2ms400 KiB
3Elfogadva14ms2212 KiB
4Elfogadva12ms3136 KiB
5Elfogadva150ms17984 KiB
6Elfogadva146ms17940 KiB
7Elfogadva70ms17768 KiB
8Elfogadva138ms17976 KiB
9Elfogadva163ms22380 KiB
10Elfogadva70ms17780 KiB