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

 

1697번: 숨바꼭질

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

www.acmicpc.net

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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

+ Recent posts