https://www.acmicpc.net/problem/16928
사다리, 뱀의 수를 입력 받고 사다리의 정보를 의미하는 x, y
뱀의 정보를 의미하는 u, v 를 입력 받아 마지막 칸에 도착할 때 까지 주사위를 굴리는 최소 횟수를 구한다.
풀이
최단 경로를 찾는 문제이므로 bfs 로 탐색해야 한다.
먼저 탐색은 1번째 칸에서 시작 한다
다음칸으로 이동할 때 거리는 주사위로 정하므로 1~6 사이이다
따라서 현재칸 +1 ~ 현재칸 + 6 을 탐색한다.
여기서 고려해야 하는 건 뱀칸과 사다리 칸이 있는 경우다
뱀칸, 사다리 칸의 좌표는 map 에 따로 저장 했다가 해당 칸이 사다리 시작점이면 다음 칸을 사다리 끝점으로 지정한다.
제 코드에서는 뱀, 사다리를 분리해서 배열, map에 저장하고 처리 했는데 분리안하고 같이 처리해도 될것으로 보인다.
전체 코드
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
// 뱀과 사다리 게임
bool visited[101];
bool isladder[101];
bool issnake[101];
map<int, int> ladder;
map<int, int> snake;
int len[101];
void bfs(int n)
{
visited[n] = true;
queue <int> q;
q.push(n);
while (!q.empty())
{
int curr = q.front();
q.pop();
// 6칸탐색
int nextmove = 0;
for (int i = 1; i <= 6; i++)
{
nextmove = curr + i;
if (nextmove <= 100)
{
// 사다리
if (isladder[nextmove])
{
nextmove = ladder[nextmove];
}
// 뱀
if (issnake[nextmove])
{
nextmove = snake[nextmove];
}
if (!visited[nextmove])
{
visited[nextmove] = true;
q.push(nextmove);
len[nextmove] = len[curr] + 1;
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
// 사다리, 뱀의 수
cin >> n >> m;
// 사다리
for (int i = 0; i < n; i++)
{
int x, y;
cin >> x >> y;
// 사다리 칸 여부
isladder[x] = true;
ladder[x] = y;
}
// 뱀
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
// 뱀 칸 여부
issnake[u] = true;
snake[u] = v;
}
bfs(1);
cout << len[100] << "\n";
}
'백준 > 골드' 카테고리의 다른 글
[백준 7576] - 토마토(C++) (0) | 2025.06.12 |
---|