BOJ
C++ [BOJ] 백준 13549번 숨바꼭질 3
coco_ball
2022. 7. 5. 22:50
https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
SOLUTION
숨바꼭질 문제와는 다르게 순간이동 하는 경우에 0초가 걸리기 때문에, 우선순위 큐를 사용해서 순간이동을 맨 앞으로 넣어서 너비 우선 탐색을 진행한다.
코드
#include <iostream>
#include <queue>
using namespace std;
int n, k;
int visited[100001];
void bfs(int n, int k) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>pq;
pq.push({ 0,n });
visited[n] = 1;
while (!pq.empty()) {
int cnt = pq.top().first;
int num = pq.top().second;
pq.pop();
if (num == k) {
cout << cnt;
return;
}
if (num * 2 < 100001 && !visited[num * 2]) {
visited[num * 2] = 1;
pq.push({ cnt, num * 2 });
}
if (num - 1 >= 0 && !visited[num - 1]) {
visited[num - 1] = 1;
pq.push({ cnt + 1, num - 1 });
}
if (num + 1 < 100001 && !visited[num + 1]) {
visited[num + 1] = 1;
pq.push({ cnt + 1, num + 1 });
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin >> n >> k;
bfs(n, k);
}