백준 16928번: 뱀과 사다리 게임 (C++)

2023. 2. 17. 17:16알고리즘/BFS & DFS

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를 이용했다.

 

뱀과 사다리에 접근했을 때 pair를 이용하면 전체 탐색을 해야할 것 같아서

map을 이용해 뱀 혹은 사다리에 키 값이 존재하면 바로 이동지점으로 갈 수 있게 했다.

 

다음 위치가 100 이상이면 탐색하지 않고 100일 때 방문 횟수를 체크하고 BFS를 종료시켰다.

 

 

 

전체 코드

#include <iostream>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <unordered_map>

using namespace std;

int N, M;
int board[101] = { 0, };
int visited[101] = { 0, };

unordered_map<int, int> ladder;
unordered_map<int, int> snake;

int bfs(int y) {
	queue<int> q;
	q.push(y);
	visited[y] = 1;

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

		for (int i = 1; i <= 6; i++) {
			int next = now + i;

			if (next > 100) continue;
			if (next == 100) return visited[next] = visited[now] + 1;

			if (visited[next] != 0) continue;

			if (board[next] == 2) { // 사다리
				visited[next] = visited[now] + 1;
				if (visited[ladder[next]] != 0) continue;
				visited[ladder[next]] = visited[next];
				q.push(ladder[next]);
				continue;
			}
			if (board[next] == 3){ // 뱀
				visited[next] = visited[now] + 1;
				if (visited[snake[next]] != 0) continue;
				visited[snake[next]] = visited[next];
				q.push(snake[next]);
				continue;
			}

			visited[next] = visited[now] + 1;
			q.push(next);
		}
	}

}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		pair<int, int> p;
		cin >> p.first >> p.second;
		board[p.first] = 2; // 사다리
		ladder.insert(p);
	}
	for (int i = 0; i < M; i++) {
		pair<int, int> p;
		cin >> p.first >> p.second;
		board[p.first] = 3; // 뱀
		snake.insert(p);
	}

	cout << bfs(1) - 1;
	
}

'알고리즘 > BFS & DFS' 카테고리의 다른 글

백준 20005번: 보스몬스터 전리품 (C++)  (0) 2023.02.22
백준 3187번: 양치기 꿍 (C++)  (0) 2023.01.31