PS

백준 12851번 숨바꼭질2

남마허 2020. 3. 10. 18:55

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

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 그리고

www.acmicpc.net

 

 

 

 

 

<접근방법>

탐색 문제입니다.

1에서 2까지 도달한다고 합시다.

+1, *2 이렇게 두 가지 방법이 있습니다.

즉, 탐색을 해가며 그 지점에 도달한 횟수도 저장해야 합니다.

 

그런데 문제가 있습니다.

1 -> 2 -> 3 -> 2 는 최단 방법이 아니므로 횟수를 저장할 때 걸러야 합니다.

즉, 이것에 대한 처리도 해야 합니다.

 

참고로..

가중치를 거쳐간 숫자의 갯수라고 합시다.

코드상으로 무조건 가중치가 낮은 순으로 탐색이 됩니다.

그러니까 먼저 도달한 방법이 최단코스 입니다.

 

 

 

 

<느낀 점>

 

 

 


 

 

 

<코드>

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

int n, k;
int visit[100001];
int dist[100001];

queue<int> q;

void bfs() {
	int res = 0, flag = 0;

	q.push(n);
	while (!flag) {
		int sz = q.size();
		while (sz--) {
			int x = q.front();
			q.pop();

			if (x == k) {
				flag++;
			}

			for (int nx : {x - 1, x + 1, x * 2}) {
				if (0 <= nx && nx <= 100000) {
					if (!dist[nx] || dist[nx] == dist[x] + 1) {
						q.push(nx);
						dist[nx] = dist[x] + 1;
					}
				}
			}
		}
		res++;
	}
	cout << res-1 << '\n';
	cout << flag << '\n';
}

int main() {
	cin >> n >> k;
	bfs();
	return 0;
}

 

 

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

int n, k;
bool visit[100001];

queue<int> q;

void bfs() {
	int res = 0, flag = 0;

	q.push(n);
	while (!flag) {
		int sz = q.size();
		while (sz--) {
			int x = q.front();
			q.pop();

			visit[x] = true;

			if (x == k) {
				flag++;
			}

			for (int nx : {x - 1, x + 1, x * 2}) {
				if (0 <= nx && nx <= 100000) {
					if (!visit[nx]) {
						q.push(nx);
					}
				}
			}
		}
		res++;
	}
	cout << res - 1 << '\n';
	cout << flag << '\n';
}

int main() {
	cin >> n >> k;
	bfs();
	return 0;
}

 

 

 

 

반응형