ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 4485 - 녹색 옷 입은 애가 젤다지?
    PS 2024. 8. 4. 20:28

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

     

    다익스트라 문제였다. 그런데 이제 어떤 정점에서 다른정점까지의 비용이 1 4 8 이런식으로 주어지는 게 아니라,

    2차원 배열로 어떤 정점에 도착했을 때의 비용이 주어지는.

    그러니깐, 한곳에서 다른곳으로 이동가능한 간선이 주어지는 게 아니라 bfs나 dfs문제 풀때처럼 상하좌우로 움직이는 거 가능하고, 어디 도착하면 거기 비용이 플러스 되는 형식이다. 

    재밌었다.

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    int a[130][130];
    int num;
    int inf = 1e9;
    int d[130][130];
    int dirY[4] = {1, -1, 0, 0};
    int dirX[4] = {0, 0, 1, -1};
    int main()
    {
        int p = 1;
        while (1)
        {
            cin >> n;
            if (n == 0)
            {
                break;
            }
            memset(a, 0, sizeof(a));
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    cin >> num;
                    a[i][j] = num;
                }
            }
    
            fill(&d[0][0], &d[0][0] + 130 * 130, inf);
            priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq; // {비용, 정점}
    
            d[0][0] = a[0][0];
            pq.push({d[0][0], {0, 0}});
            while (pq.size())
            {
                auto cur = pq.top();
                pq.pop();
                int price = cur.first;
                int curY = cur.second.first;
                int curX = cur.second.second;
    
                if (d[curY][curX] < price)
                {
                    continue;
                }
    
                for (int i = 0; i < 4; i++)
                {
                    int nextY = curY + dirY[i];
                    int nextX = curX + dirX[i];
                    if (nextY < 0 || nextY >= n || nextX < 0 || nextX >= n)
                    {
                        continue;
                    }
    
                    int nextPrice = a[nextY][nextX];
                    if (d[nextY][nextX] <= price + nextPrice)
                    {
                        continue;
                    }
                    d[nextY][nextX] = price + nextPrice;
                    pq.push({d[nextY][nextX], {nextY, nextX}});
                }
            }
            cout << "Problem " << p << ": " << d[n - 1][n - 1] << "\n";
            p++;
        }
        return 0;
    }

    'PS' 카테고리의 다른 글

    BOJ 17142 - 연구소 3  (0) 2024.08.13
    BOJ 2631 - 줄세우기  (0) 2024.08.05
    BOJ 5972 택배 배송  (0) 2024.08.02
    6.유저인증 - JWT - 로그인, 회원가입등을 만들어보자. - 서버 ++ 에러핸들링  (1) 2024.08.01
    BOJ 14719 빗물  (0) 2024.08.01

    댓글

Designed by Tistory.