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 |