N

(백준 c++)1697 숨바꼭질 본문

백준 알고리즘

(백준 c++)1697 숨바꼭질

naeunchan 2021. 3. 10. 11:54
728x90
반응형

문제

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

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 

 

 

BFS로 해결.

주의사항은 같은 지점일 때 처리하는 경우와 0 ~ 100000 까지 범위를 잘 설정해야 한다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main(void){
    int N, K, ans = 0;
    int direct_x[3] = {-1, 1, 2};
    vector<int> board(200001, 0);
    vector<bool> visited(200001, false);
    queue<int> q;

    cin >> N >> K;

    //같은 점에 위치할 때
    if(N == K){
        cout << 0;
        return 0;
    }
    
    board[N] = 1;
    visited[N] = true;

    q.push(N);

    while(!q.empty()){
        int size = q.size();

        for(int i = 0; i < size; i++){
            int x = q.front();
            
            q.pop();
            
            for(int j = 0; j < 3; j++){
                int nx = 0;

                //-1, 1, * 2 처리
                if(j != 2){
                    nx = x + direct_x[j];
                }
                else{
                    nx = x * direct_x[j];
                }

                if(nx >= 0 && nx < 100001 & !visited[nx]){
                    if(nx == K){
                        cout << ++ans;
                        return 0;
                    }

                    visited[nx] = true;
                    q.push(nx);
                }
            }
        }
        ans++;
    }

    return 0;
}
728x90
반응형

'백준 알고리즘' 카테고리의 다른 글

(백준 c++)5086 배수와 약수  (0) 2021.03.17
(백준 c++)2206 벽 부수고 이동하기  (0) 2021.03.11
(백준 c++)7569 토마토  (0) 2021.03.10
(백준 c++)2178 미로 탐색  (0) 2021.03.09
(백준 c++)1463 1로 만들기  (0) 2021.03.09