www.acmicpc.net/problem/16928

 

16928번: 뱀과 사다리 게임

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

www.acmicpc.net


  • 목표지점 100 까지 주사위를 최소로 던져서 가야 한다.
  • 주사위의 값을 정할 수 있기 때문에, 주사위를 한번 던질 때 가능한 모든 경우를 하나의 너비로 보고 bfs 를 돌린다.
  • 뱀을 타고 내려와서 목적지에 더 가까운 사다리를 탈 수도 있기 때문에, 뱀을 무시하고 사다리만 타는 그리디한 방식으로 접근하면 안된다.

#include <iostream>
#include <queue>

using namespace std;

int N, M, temp1, temp2;
pair<int,int> ladders[30];      // 사다리와 뱀 둘 다 포함
bool visited[101];
int answer = 0;

int main(void)
{
    cin >> N >> M;
    for(int i = 0 ; i < N + M ; i++)
    {
        cin >> temp1 >> temp2;
        ladders[i] = {temp1, temp2};
    }

    queue<int> q;
    q.push(1);
    visited[1] = true;          // 1 에서 출발하여 bfs 시작

    while(true)
    {
        int sz = q.size();
        for(int s = 0 ; s < sz ; s++)
        {
            int cur = q.front();
            q.pop();
            
            for(int i = 1 ; i <= 6 ; i++)           // 주사위 1~6 까지 모두 고려
            {
                int next = cur + i;
                if(visited[next]) continue;         // 이전에 방문한 위치면 스킵
                visited[next] = true;
                for(int n = 0 ; n < N + M ; n++)    // 사다리나 뱀에 연결된 위치라면
                {
                    if(next == ladders[n].first)
                    {
                        next = ladders[n].second;   // 타고 올라가거나 내려감
                        break;
                    }
                }
                if(next > 100) continue;

                if(next == 100)                     // 다음 위치가 목적지라면 종료
                {
                    cout << answer+1 << endl;
                    return 0;
                }

                q.push(next);
            }
        }
        answer++;
    }
}

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

[백준] 11664 : 선분과 점  (0) 2021.05.04
[백준] 10830 : 행렬 제곱  (0) 2021.05.02
[백준] 11659 : 구간 합 구하기 4  (0) 2021.04.30
[백준] 1707 : 이분 그래프  (0) 2021.04.13
[백준] 2583 : 영역 구하기  (0) 2021.04.12

+ Recent posts