본문 바로가기
Algorithm/BOJ

[BOJ]16928번: 뱀과 사다리 게임 (c++)

by HBGB 2020. 6. 13.

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

 

bfs

#include <iostream>
#include <vector>
#include <queue>
#include <limits>

using namespace std;

const int MAX = 100;

int bfs(vector<int> &SnL, vector<int> &min_cnt)
{
	// 1부터 시작
	queue<int> q;
	q.push(1);
	min_cnt[1] = 0;

	while (!q.empty())
	{
		int now = q.front();
		q.pop();

		// 100에 도착하면 최소 이동횟수 리턴
		if (now == MAX)
		{
			return min_cnt[now];
		}

		// 주사위 던지기
		for (int i = 1; i <= 6; ++i)
		{
			// 다음숫자 : 사다리/뱀 반영된 숫자 + 주사위 눈 (100 초과는 이동X)
			int next = (SnL[now] > 0) ? SnL[now] + i : now + i;
			if (next > 100)
			{
				continue;
			}

			// 이미 최소값이 매겨졌다면 건너뛰기
			if (min_cnt[next] > min_cnt[now] + 1)
			{
				min_cnt[next] = min_cnt[now] + 1;
				q.push(next);
			}
		}
	}
	return -1;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N, M;
	cin >> N >> M;
	vector<int> SnL(MAX + 1);
	for (int i = 0; i < N + M; ++i)
	{
		int now, next;
		cin >> now >> next;
		SnL[now] = next;
	}

	// 이동횟수 최소값을 저장하기 위한 벡터
	vector<int> min_cnt(MAX + 1, numeric_limits<int>::max());

	// 1 ~ 100까지 최소 이동횟수 출력
	cout << bfs(SnL, min_cnt);

	return 0;
}

 

 

 

문제에서는 뱀/사다리가 다른 것처럼 나오지만,

구현할 때 둘의 차이를 둘 필요가 없다.

벡터 하나에 모두 입력하고,

bfs함수에서 큐에 push하기 전 뱀/사다리가 있는 숫자인지 여부를 확인해주면 된다.

// 주사위 던지기
for (int i = 1; i <= 6; ++i)
{
	// 다음숫자 : 사다리/뱀 반영된 숫자 + 주사위 눈 (100 초과는 이동X)
	int next = (SnL[now] > 0) ? SnL[now] + i : now + i;
    ...

 

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

[BOJ]14502번: 연구소 (c++)  (0) 2020.06.13
[BOJ]16948번: 데스 나이트 (c++)  (0) 2020.06.13
[BOJ]12100번: 2048 (Easy) (c++)  (0) 2020.06.13
[BOJ] 13460번: 구슬 탈출 2 (c++)  (0) 2020.06.13
[BOJ]1062번: 가르침 (c++)  (0) 2020.06.12

댓글