Submission #1211739

#TimeUsernameProblemLanguageResultExecution timeMemory
1211739mehraliiAwesome Arrowland Adventure (eJOI19_adventure)C++20
100 / 100
42 ms1608 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template <typename T>
using indexed_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

static mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

#define ll long long
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define eb emplace_back
#define ins insert
#define F fist
#define S second

constexpr int MAXN = 1e5;
const int LOG = __lg(MAXN)+1;

constexpr int INF = 1e9;
constexpr int MOD = 1e9+7;
constexpr double EPS = 1e-8;

/*
	EJOI 2019, Day 2, problem A, 100p.
*/

int f(char f, char t){
	if (f == 'X'){
		return INF;
	}

	if (f == t){
		return 0;
	}

	if (f == 'W'){
		if (t == 'N'){
			return 1;
		} else if (t == 'E'){
			return 2;
		} else {
			return 3;
		}
	} else if (f == 'N'){
		if (t == 'W'){
			return 3;
		} else if (t == 'S'){
			return 2;
		} else {
			return 1;
		}
	} else if (f == 'E'){
		if(t == 'W'){
			return 2;
		} else if (t == 'S'){
			return 1;
		} else {
			return 3;
		}
	} else{
		if (t == 'W'){
			return 1;
		} else if (t == 'N'){
			return 2;
		} else {
			return 3;
		}
	}
}

int n, m;

bool ok(int tx, int ty){
	return 0 <= tx && tx < n && 0 <= ty && ty < m;
}

void solve(){
	cin >> n >> m;

	vector<string> g(n);
	for(auto& x: g){
		cin >> x;
	}

	vector<vector<int>> d(n, vector<int>(m, INF));
	set<tuple<int, int, int>> q;

	vector<int> dx = {1, -1, 0, 0};
	vector<int> dy = {0, 0, 1, -1};
	string v = "SNEW";

	q.ins({d[0][0] = 0, 0, 0});

	int dist, x, y;

	while(!q.empty()){
		tie(dist, x, y) = *q.begin();
		q.erase(q.begin());

		for(int k = 0; k < 4; k++){
			int tx = x + dx[k], ty = y + dy[k];
			if (ok(tx, ty)){
				if(tx != n-1 && ty != m-1 && g[tx][ty] == 'X'){
					continue;
				}
				if (dist + f(g[x][y], v[k]) < d[tx][ty]){
					q.erase({d[tx][ty], tx, ty});
					d[tx][ty] = dist + f(g[x][y], v[k]);
					q.ins({d[tx][ty], tx, ty});
				}
			}
		}
	}

	if (d[n-1][m-1] == INF){
		cout << "-1\n";
	} else{
		cout << d[n-1][m-1] << '\n';
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = 1;
	// cin >> t;
	for(int i = 1; i <= t; i++){
		solve();
	}
}
#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...