※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 16928번 문제인 뱀과 사다리 게임이다.
문제는 아래 링크를 확인하자.
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
뱀과 사다리 게임판을 하나의 그래프로 생각해보자.
게임판의 각 칸을 하나의 노드로 생각하고, 각 칸 A에서 주사위를 던져서 (사다리와 뱀 등을 거친 후) 이동하게 되는 칸 B로 이동하는 것을 하나의 에지로 생각할 수 있다.
이 때, 이 문제를 푸는 것은 에지를 최소 몇개를 거쳐서 1에서 100까지 이동할 수 있는가가 된다. 이는 BFS를 이용하여 간단히 해결할 수 있다.
99번 칸에서 6의 주사위눈이 나온다던가 하는 100번칸을 넘어가는 이동이 없다는 점에 신경을 써서 구현하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
using namespace std;
int board[106];
int dist[106];
queue<int> que;
bool visited[106];
void bfs() {
while (!que.empty()) {
int current = que.front(); que.pop();
for (int i = 1; i <= 6; i++) {
int next = board[current + i];
if (visited[next]) continue;
visited[next] = 1;
dist[next] = dist[current] + 1;
que.push(next);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 1; i <= 100; i++) board[i] = i;
int N, M; cin >> N >> M;
N += M;
while (N--) {
int x, y; cin >> x >> y;
board[x] = y;
}
visited[1] = 1;
que.push(1);
bfs();
cout << dist[100];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17144 // C++] 미세먼지 안녕! (0) | 2021.06.29 |
---|---|
[BOJ 6064 // C++] 카잉 달력 (0) | 2021.06.28 |
[BOJ 12852 // C++] 1로 만들기 2 (0) | 2021.06.26 |
[BOJ 20305 // C++] 피보나치와 수열과 쿼리 (0) | 2021.06.25 |
[BOJ 16953 // C++] A → B (0) | 2021.06.24 |