Submission #790259

#TimeUsernameProblemLanguageResultExecution timeMemory
790259LudisseyAwesome Arrowland Adventure (eJOI19_adventure)C++14
100 / 100
91 ms6640 KiB
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <cstring>
#include <unordered_map>
#include <vector>
#include <fstream>
#include <bitset>
#include <tuple>
#include <cmath>
#include <cstdint>
#include <stack>
#include <cassert>
#include <cstdio>
#include <queue>
#include <iterator>
#include <iomanip>
#include <algorithm>
#include <sstream>

#define long long int;
using namespace std;

int newVal(int nb, int dir) {
	if (nb > dir) return dir + (4 - nb);
	return dir - nb;
}

int r, c;
vector<vector<int>> grid;
vector<vector<int>> dist;
vector<vector<int>> visited;

pair<int, pair<int, int>> moves[4] = { { 0, {0, -1} }, { 1,{1, 0} }, { 2, {0, 1} }, { 3,{-1, 0} } };

signed main() {
	cin >> r >> c;
	grid.resize(c, vector<int>(r));
	dist.resize(c, vector<int>(r));
	visited.resize(c, vector<int>(r));

	for (int y = 0; y < r; y++)
	{
		for (int x = 0; x < c; x++)
		{
			char c;
			cin >> c;
			if (c == 'X') grid[x][y] = -1;
			else if (c == 'N') grid[x][y] = 0;
			else if (c == 'E') grid[x][y] = 1;
			else if (c == 'S') grid[x][y] = 2;
			else if (c == 'W') grid[x][y] = 3;
			dist[x][y] = 1000000000;
		}
	} 

	priority_queue<pair<int, pair<int,int>>> q;
	dist[0][0] = 0;
	q.push({ 0,{0,0 } });
	while (!q.empty()) {
		int x = q.top().second.first, y= q.top().second.second; q.pop();
		if (visited[x][y]) continue;
		visited[x][y] = true;
		if (grid[x][y] == -1)continue;
		for (int s = 0; s < 4; s++)
		{
			int i = x + moves[s].second.first; 
			int j = y + moves[s].second.second;
			if (i >= c || j >= r || min(i,j)<0) continue;

			int w = newVal(grid[x][y], moves[s].first);
			if (abs(dist[x][y]) + w < abs(dist[i][j])) {
				dist[i][j] = abs(dist[x][y]) + w;
				q.push({ -dist[i][j],{i,j} });
			}
		}
	}
	if (!visited[c - 1][r-1]) cout << -1 << "\n";
	else cout << dist[c-1][r-1] << "\n";
	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...