오늘의 알고리즘

[C++] 백준 16928 뱀과 사다리 게임

하늘하늘 . 2022. 9. 27. 01:45
#include <iostream>
#include <queue>
 
int DP[101] = {};
bool visit[102] = {};
 
int main() 
{
    int N = 0;
    int M = 0;
    int iStart = 0;
    int iEnd = 0;
 
    std::cin >> N >> M;
 
    for (int i = 0; i < N; ++i) 
    {
        std::cin >> iStart >> iEnd;
        DP[iStart] = iEnd;
    }
 
    for (int i = 0; i < M; ++i) 
    {
        std::cin >> iStart >> iEnd;
        DP[iStart] = iEnd;
    }
 
    int iCount = 0;
    std::queue<std::pair<int, int>> que = {};
    que.push({ 1, iCount });
 
    while (!que.empty())
    {
        int iX = que.front().first;
        int iY = que.front().second;
        que.pop();
 
        for (int i = 1; i <= 6; ++i)
        {
            int iNextX = iX + i;
 
            if (iNextX == 100)
            {
                std::cout << iY + 1;
                return 0;
            }
 
            else
            {
                while (DP[iNextX])
                {
                    iNextX = DP[iNextX];
                }
 
                if (!visit[iNextX])
                {
                    que.push({ iNextX, iY + 1 });
                    visit[iNextX] = true;
                }
            }
        }
    }
 
    return 0;
}

DP라고 생각해서 DP라고 만들었습니다. 처음엔 우선순위큐로 만들었다가 앞에 있기만 한다고 모두 되는게 아니라는 걸 판단... 다시 큐로 만들었습니다. 입력 들어왔을 때 바로 이동할 곳을 만들어 놓고 6번 모두 입력해줘야 합니다.