Submission #1252393

#TimeUsernameProblemLanguageResultExecution timeMemory
1252393onur8ocakAwesome Arrowland Adventure (eJOI19_adventure)C++20
50 / 100
2096 ms29508 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(){
	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;
	priority_queue<int> q;
	q.push(0);
	vector<int> dp(300005,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 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...