https://www.acmicpc.net/problem/4485

 

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

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net


    • 행렬의 모양으로 되어 있더라도 노드 간의 연결성을 이용해 다익스트라로 풀 수 있다.
    • 특정 노드는 가장자리를 제외한다면 상하좌우 4방향으로 노드와 연결 되어 있다.
    • 입력 받은 N 을 통해 2차원 행렬과 1차원 벡터 사이의 인덱싱을 연결하여 다익스트라를 돌린다.
    • 시작점의 도둑루피 크기도 포함시켜줘야 한다.

#include <iostream>
#include <vector>
#include <queue>

#define INF 1000000000

using namespace std;

int TC, N, answer;
int map[125][125];
int dir[4] = {1, -1, 0, 0};

int main(void)
{
    cin >> N;
    while(N)
    {
        for(int r = 0 ; r < N ; r++)
            for(int c = 0 ; c < N ; c++)
                cin >> map[r][c];

        vector<int> distance(N*N, INF);             // 다익스트라용 최단거리값 저장, 2차원을 1차원으로 늘려놨음
        distance[0] = map[0][0];                    // 출발지점 값을 거리에 포함시킴
        priority_queue<pair<int,int>> pq;
        pq.push({-distance[0], 0});                 // 최소힙 바꾸는 대신 거리를 음수화

        while(pq.size())
        {
            int dist = -pq.top().first;
            int cur = pq.top().second;
            pq.pop();
            if(distance[cur] < dist) continue;
            for(int i = 0 ; i < 4 ; i++)            // 각 노드는 상하좌우 4방향이랑 연결되어있음
            {
                int nextR = cur/N + dir[i];         // 1차원 위치를 2차원으로 바꿔준뒤
                int nextC = cur%N + dir[3-i];       // 가장자리 노드들에 대한 검사
                if(nextR < 0 || nextC < 0 || nextR >= N || nextC >= N) continue;
                int next = N * nextR + nextC;
                int nextDist = map[nextR][nextC] + dist;
                if(nextDist < distance[next])       // 최단 거리가 갱신되는 루트라면
                {
                    distance[next] = nextDist;      // 갱신 후 pq 에 넣어줌
                    pq.push({-nextDist, next});
                }
            }
        }

        cout << "Problem " << ++TC << ": " << distance[N*N-1] << endl;
        cin >> N;
    }
} 

'PS > BOJ' 카테고리의 다른 글

[백준] 11722 : 가장 긴 감소하는 부분 수열  (0) 2021.05.26
[백준] 11779 : 최소비용 구하기 2  (0) 2021.05.24
[백준] 11444 : 피보나치 수 6  (0) 2021.05.22
[백준] 10819 : 차이를 최대로  (0) 2021.05.21
[백준] 13172 : Σ  (0) 2021.05.19

+ Recent posts