알고리즘/백준

[백준/C,C++] 1697번: 숨바꼭질

이민훈 2021. 5. 5. 03:15

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

풀이

경우의 수가 1을 뺀다, 더한다, 2를 곱한다. 3가지입니다.

 

3가지의 경우를 BFS로 탐색하며 결괏값과 일치하는 경우 깊이를 출력해주면 됩니다.

 

#include<iostream>
#include<queue>

using namespace std;

const int MAX = 100001;

int n, k;
queue<int> q;
int depth[MAX];

int move(int n, int way)
{
    if (way == 0) return n - 1;
    else if (way == 1) return n + 1;
    else return n * 2;
}

bool check(int n)
{
    if (n >= 0 && n <= 100000) {
        if (depth[n] == 0) return true;
    }
    return false;
}

void BFS()
{
    q.push(n);
    depth[n] = 1;
    while(!q.empty()) {
        int pre = q.front();
        q.pop();
        for (int i = 0; i < 3; i++) {
            int next = move(pre, i);
            if (check(next)) {
                q.push(next);
                depth[next] = depth[pre] + 1;
                if (next == k) return;
            }
        }
    }
}

int main(void)
{
    cin >> n >> k;

    BFS();

    cout << depth[k] - 1;

    return 0;
}

반례

Input

1 10

Output

4

 

Input

2555 59999

Output

686

 

Input

99999 9

Output

99990

 

Input

0 100000

Output

22