Posts 4485 젤다
Post
Cancel

4485 젤다

알고리즘

  • 문제를 해석하면, 한 점에서 다른 한 점까지 가는데 최소경로를 찾는 문제로 해석할 수 있다.
  • 따라서 다익스트라 알고리즘을 적용하면 쉽게 풀수있다.
    • 이때 한 칸에 저장된 값은, 그 칸으로 접근하는 경로의 길이로 치환하여 품.

여담

  • 문제 내에 다익스트라라는 꽤나 많은 힌트가 있었으나, dfs에 사로잡혀서 오래 걸렸다.
  • 2차원 배열을 대상으로 다익스트라를 구현한 문제는 처음이었기에 꽤나 신선했다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <queue>
#define INF 2000000000
using namespace std;

int n, map[125][125], os[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} }, save[125][125];
bool check[125][125];
priority_queue<pair<int, pair<int,int>>> q;

int dijk();
int min(int a, int b) {
	return a > b ? b : a;
}

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

	int idx = 1;
	while (true) {
		cin >> n;
		if (n == 0)
			break;

		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++) {
				cin >> map[i][j];
				check[i][j] = false;
			}

		cout << "Problem " << idx++ << ": " << dijk() << endl;
	}
}

int dijk() {
	q.push({ -map[0][0] , {0,0 } });
	save[0][0] = map[0][0];

	while (!q.empty()) {
		int cur = -q.top().first, r = q.top().second.first, c = q.top().second.second;
		q.pop();

		if (check[r][c])
			continue;
		check[r][c] = true;
		save[r][c] = cur;

		for (int i = 0; i < 4; i++) {
			int nr = r + os[i][0], nc = c + os[i][1];

			if (nr >= 0 && nr < n && nc >= 0 && nc < n && !check[nr][nc]) {
 				int ncur = cur + map[nr][nc];
				q.push({ -ncur, {nr, nc} });
			}
		}
	}

	return save[n - 1][n - 1];
}
This post is licensed under CC BY 4.0 by the author.

1613 역사

14658 하늘에서 별똥별

Comments powered by Disqus.