PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

백준 16928 뱀과 사다리 게임(c++)

SeungbeomKim 2023. 1. 29. 16:41

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

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net

이 문제는 뱀과 사다리에 대한 정보가 주어지고, 사다리는 해당 칸에서 위로 올라갈 수 있지만, 뱀은 아래로 내려가는 구조입니다. 만약 사다리나 뱀을 만나지 않는다면, 주사위를 던져 나올 수 있는 모든 경로를 탐색하면 됩니다(6가지)

<코드>

#include <iostream>
#include <queue>

using namespace std;
int dist[101];
int nex[101];
using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= 100; i++)
    {
        nex[i] = i;
        dist[i] = -1;
    }
    // 거리 초기화

    while (n--)
    {
        int x, y;
        cin >> x >> y;
        nex[x] = y;
    }
    // 사다리

    while (m--)
    {
        int x, y;
        cin >> x >> y;
        nex[x] = y;
    }
    // 뱀

    dist[1] = 0;
    queue<int> q;
    q.push(1);

    while (!q.empty())
    {
        int x = q.front();
        q.pop();
        for (int i = 1; i <= 6; i++)
        {
            int y = x + i;
            if (y > 100)
                continue;
            y = nex[y];
            if (dist[y] == -1)
            {
                dist[y] = dist[x] + 1;
                q.push(y);
            }
        }
    }
    cout << dist[100];
    return 0;
}

우선적으로, 뱀과 사다리에 대한 정보를 저장해 둡니다. 더불어, 시작점에서는 아직 이동을 하지 않았으므로 모든 이동거리를 -1로 초기화해줘야 합니다. 그리고 1번 칸에서 시작하기 때문에 1번 칸에 대한 정보를 push 하고 BFS 탐색을 시작하게 됩니다. 만약 해당 인덱스에 방문하지 않았으면, 이전 방문 횟수 + 1을 통해 이동 횟수를 1번 증가시켜 주면 됩니다.