PS

백준 16928번 뱀과 사다리 게임

남마허 2020. 3. 19. 11:41

https://www.acmicpc.net/problem/16928

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으로 이동한다는 의미이다. 다음 M개의 줄에는 뱀의 정보를 의미하는 u, v (u > v)가 주어진다. u번 칸에 도착하면, v번 칸으로 이동한다는 의미이다. 1번 칸과 100번 칸은 뱀과 사다리의 시작 또는 끝이 아니다. 모든 칸

www.acmicpc.net

 

 

 

 

 

 

<접근방법>

bfs 문제입니다.

해당 지점이 뱀인지 사다리인지는 중요하지 않습니다.

다만 그 지점이 다른 좌표로 이동한다는 사실입니다.

그래서 2차원 배열을 만들고 그 지점이 이동할 좌표를 저장해주었습니다.

뱀 혹은 사다리가 아닌 경우에는 그 지점의 좌표를 저장했습니다.

 

 

<느낀 점>

 

 

 


 

 

 

<코드>

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

int n, m, map[11][11], res;
bool visit[101];

queue<int> q;

void bfs() {
	q.push(0);
	visit[0] = true;

	while (!q.empty()) {
		int sz = q.size();
		for (int z = 0; z < sz; z++) {
			int now = q.front();
			q.pop();

			if (now == 99) {
				return;
			}

			for (int i = 1; i <= 6; i++) {
				int next = now + i;
				int ny = next / 10;
				int nx = next % 10;

				if (next > 99 || visit[next]) continue;

				visit[next] = true;

				int np = map[ny][nx];

				q.push(np);
			}
		}
		res++;
	}
}

int main() {
	int num = 0;
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			map[i][j] = num++;
		}
	}

	cin >> n >> m;

	while (n--) {
		int a, b, ay, ax, by, bx;
		cin >> a >> b;
		a--; b--;
		
		ay = a / 10;
		ax = a % 10;

		map[ay][ax] = b;
	}
	while (m--) {
		int a, b, ay, ax, by, bx;
		cin >> a >> b;
		a--; b--;

		ay = a / 10;
		ax = a % 10;

		map[ay][ax] = b;
	}

	bfs();

	cout << res << '\n';

	return 0;
}

 

 

 

 

 

반응형