https://www.acmicpc.net/problem/1697
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입력 1 복사
5 17
예제 출력 1 복사
4
힌트
수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.
코드
#include <iostream>
#include <queue>
using namespace std;
#define MAX 1000001
int n, k;
int dis[MAX];
queue<int> q;
int Bfs(int start, int finish)
{
q.push(n);
while (!q.empty())
{
int cur = q.front();
int dir[3] = { 1, -1, cur }; // 수빈이가 이동할 수 있는 방향 벡터
q.pop();
// 현재 위치가 동생의 위치라면 이동 횟수 반환
if (cur == finish) return dis[cur];
for (int i = 0; i < 3; i++)
{
int next = cur + dir[i];
if (next < 0 || next >= MAX || dis[next] != 0) continue;
q.push(next);
dis[next] = dis[cur] + 1;
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
int result = Bfs(n, k);
cout << result;
return 0;
}
'C++ > BFS, DFS' 카테고리의 다른 글
[C++] 백준 2636 - 치즈 (0) | 2023.01.13 |
---|---|
[C++] 백준 2589 - 보물섬 (0) | 2022.12.28 |
[C++] 백준 7562 - 나이트의 이동 (2) | 2022.12.26 |
[C++] 백준 11724 - 연결 요소의 개수 (0) | 2022.12.26 |
[C++] 백준 2644 - 촌수계산 (0) | 2022.12.26 |