어흥

[백준 4485] 녹색 옷 입은 애가 젤다지? (C++) 본문

알고리즘/백준

[백준 4485] 녹색 옷 입은 애가 젤다지? (C++)

라이언납시오 2020. 3. 31. 20:47
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/4485

 

4485번: 녹색 옷 입은 애가 젤다지?

문제 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입

www.acmicpc.net

1. 주의할 점

- 이미 방문했거나, 해당 지점에 도착할때까지 소비한 루피가 많은 경우 방문하지 않는다

- 매 테스트케이스마다 초기화를 진행한다

 

2. 구현

- 다익스트라 알고리즘을 통해서 구현하며, 초기 위치는 (0,0)이다

- 우선순위큐를 통해 현재까지 소모한 루피가 가장 적은 값이 Top에 올라오도록 설정한다

- 현재 좌표가 (Num-1,Num-1)인 경우 종료와 함께 답을 출력한다.

 

#define MAX 987654321
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct info {
	int x, y, val;
};
struct cmp {
	bool operator()(info &a, info &b) {
		return a.val > b.val;
	}
};
info tmp;
int num;
int arr[125][125];
bool check[125][125];
int dist[125][125];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int result;
	for(int k=1;;k++) {
		cin >> num;
		if (num == 0) break;
		result = 0;
		for (int i = 0; i < num; i++)
			for (int j = 0; j < num; j++) {
				cin >> arr[i][j];
				check[i][j] = false;
				dist[i][j] = MAX;
			}

		priority_queue<info, vector<info>, cmp> pq;
		tmp.x = 0;
		tmp.y = 0;
		tmp.val = arr[0][0];
		pq.push(tmp);
		dist[0][0] = arr[0][0];
		while (!pq.empty()) {
			int cx = pq.top().x;
			int cy = pq.top().y;
			int cv = pq.top().val;
			pq.pop();
			if (cy == num - 1 && cx == num - 1) {
				result = cv;
				break;
			}
			if (check[cy][cx]) continue;
			check[cy][cx] = true;
			for (int i = 0; i < 4; i++) {
				int nx = cx + dx[i];
				int ny = cy + dy[i];
				if (nx >= 0 && ny >= 0 && nx < num && ny < num && !check[ny][nx]) {
					if (dist[ny][nx] > cv + arr[ny][nx]) {
						dist[ny][nx] = cv + arr[ny][nx];
						tmp.x = nx;
						tmp.y = ny;
						tmp.val = dist[ny][nx];
						pq.push(tmp);
					}
				}
			}
		}
		cout << "Problem "<<k<<": "<<result << '\n';
	}
	system("pause");
	return 0;
}
728x90
반응형
Comments