본문 바로가기
Algorithm/BAEKJOON

[백준/C++] 뱀과 사다리 게임

by code_pie 2024. 4. 13.
 

 

풀이

 

[문제 풀이]

 

이 문제는 특정 칸에 이동했을 때, 뱀이나 사다리가 있다면 다른 칸으로 이동할 수 있는 게 특징이다.

 

이렇게 이동을 하면서 마지막 칸인 100번 칸에 도착하면 승리하는데, 주사위를 조작해 원하는 숫자를 낼 수 있다면 100번 칸에 도달하기 위해 주사위를 가장 적게 굴리는 횟수를 구하는 문제다.

 

한번 이동할 때 마다 주사위를 굴리는 횟수가 1씩 늘어나므로, BFS로 문제를 풀면 빠르게 풀 수 있다.

 

이동 할 수 있는 곳은 현재 칸에서 1~6으로 6 곳이고, 이 6곳에 도착했을 때 뱀이나 사다리가 있다면 다른 칸으로 이동하면 된다.

 

이렇게 BFS로 문제를 구현하면 100번 칸에 처음 도달했을 때, 주사위를 굴린 횟수가 가장 적은 최소 횟수이므로 이 값을 출력하면 된다.

 

 

 

[아이디어 정리]

  1. 어떤 칸에 사다리나 뱀이 연결되어 있다면, 방문했을 때 이동해야하는 다음 칸을 표시할 vector를 만들어 저장한다.
  2. 주사위를 굴려 1~6의 범위로 이동하고, 그 칸에 사다리나 뱀이 연결되어있는지 확인한다.
  3. 만약 사다리나 뱀이 없다면 그 칸에 그대로 남아있고, 사다리나 뱀이 있다면 다른 칸으로 이동한 뒤 방문표시를 한다.
  4. BFS 탐색을 하다가 100번 칸을 처음 방문하게 되면 그때의 주사위를 굴린 횟수를 출력하고 코드를 종료한다.

 

 

 

Code

 

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int N, M;
	cin >> N >> M;
	vector<int> ls(101,0);// ls[i]칸으로 이동하라는 뜻
	vector<int> visited(101, false); // 방문했는지 확인
	int a, b;
	for (int i = 0; i < N+M; i++) 
	{
		cin >> a >> b;
		ls[a] = b;
	}
	queue<pair<int, int>> q;
	pair<int, int> np = make_pair(1, 0);
	visited[1] = true;
	q.push(np);
	int nNum;
	while(!q.empty())
	{
		np = q.front();
		q.pop();
		if (np.first == 100) 
		{
			break;
		}
		for (int i = 1; i <= 6; i++) 
		{
			nNum = np.first + i;
			if (nNum<=100&&!visited[nNum]) 
			{
				visited[nNum] = true;
				if (ls[nNum] != 0) 
				{
					nNum = ls[nNum];
					visited[nNum] = true;
				}
				q.push(make_pair(nNum,np.second+1));
			}
		}
	}
	cout << np.second << endl;
	return 0;
}

 


쉽게 풀 수 있는 BFS 문제였다 EZ 

 

16928번: 뱀과 사다리 게임

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

www.acmicpc.net

 

반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[백준/C++] 이분 그래프  (0) 2024.04.14
[백준/C++] 벽 부수고 이동하기  (1) 2024.04.13
[백준/C++] 3차원 토마토  (0) 2024.04.12
[백준/C++] 숨바꼭질  (0) 2024.04.12
[백준/C++] 오아시스 재결합  (0) 2024.04.11