제출 #1252414

#제출 시각아이디문제언어결과실행 시간메모리
1252414onur8ocakAwesome Arrowland Adventure (eJOI19_adventure)C++20
100 / 100
77 ms33208 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...