※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13913번 문제인 숨바꼭질 4이다.
문제는 아래 링크를 확인하자.

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

 

13913번: 숨바꼭질 4

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

각 숫자 N에 대하여, N+1, N-1과 2*N을 향한 (방향이 있는) 에지가 있는 방향그래프를 생각해보자.

이 그래프에서, 수빈이가 있는 점을 출발점으로, 동생이 있는 점을 도착점으로 하는 BFS를 하면 문제를 해결할 수 있다.

 

실제 방문순서는 이 점을 오기 전에 어떤 점에서 왔는지를 기록해두는 것(BFS트리의 부모를 기록해두는 것)으로 다시 역추적할 수 있다.

 

아래는 제출한 소스코드이다.

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

int dist[200001];
int parent[200001];
queue<int> que;
stack<int> stk;

int cnt = 0;

void bfs() {
	while (!que.empty()) {
		int current = que.front();
		if (current > 0) {
			if (dist[current - 1] == 0) {
				dist[current - 1] = dist[current] + 1;
				parent[current - 1] = current;
				que.push(current - 1);
			}
		}
		if (current < 200000) {
			if (dist[current + 1] == 0) {
				dist[current + 1] = dist[current] + 1;
				parent[current + 1] = current;
				que.push(current + 1);
			}
		}
		if (current * 2 <= 200000) {
			if (dist[current * 2] == 0) {
				dist[current * 2] = dist[current] + 1;
				parent[current * 2] = current;
				que.push(current * 2);
			}
		}
		que.pop();
	}
}

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

	int S, E; cin >> S >> E;
	dist[S] = 1;
	parent[S] = S;
	que.push(S);
	bfs();

	cout << dist[E] - 1 << '\n';
	
	while (E != S) {
		stk.push(E);
		E = parent[E];
	}

	cout << S << ' ';
	while (!stk.empty()) {
		cout << stk.top() << ' ';
		stk.pop();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2568 // C++] 전깃줄 - 2  (0) 2021.07.24
[BOJ 18263 // C++] Milk Visits  (0) 2021.07.23
[BOJ 1647 // C++] 도시 분할 계획  (0) 2021.07.21
[BOJ 15480 // C++] LCA와 쿼리  (0) 2021.07.20
[BOJ 3351 // C++] 삼각 분할  (0) 2021.07.19

+ Recent posts