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

2021. 3. 26. 18:05알고리즘/BFS DFS

728x90
반응형

문제: www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

 

문제풀이

 

일차원 선 위에서 BFS를 이용하여 최단거리를 구하였다.

 

이때 수빈이와 동생의 위치는 0부터 100, 000까지이지만

수빈이는 현재 거리의 2배를 순간 이동할 수 있기 때문에 거리 배열을 100,000의 두배인 200,001로 선언하였다.

 

 

코드

#include <iostream>
#include <queue>

using namespace std;

int dist[200001];

int main(){
    ios::sync_with_stdio(false); cin.tie(NULL);

    int n,k;
    cin>>n>>k;

    queue<int> q;
    q.push(n); //수빈이의 시작위치
    dist[n] = 1;

    while(true){
        int cur = q.front();
        q.pop();

        if(cur == k){
            cout<<dist[cur]-1; //수빈이의 시작위치가 1이였기 때문에 1을 빼준다.
            return 0;
        }

        if(cur-1 >= 0 && cur-1 <= 200000 && dist[cur-1] == 0){ //-1만큼 걸을때
            dist[cur-1] = dist[cur] + 1;
            q.push(cur-1);
        }

        if(cur+1 >= 0 && cur+1 <= 200000 && dist[cur+1] == 0){ //1만큼 걸을때
            dist[cur+1] = dist[cur] + 1;
            q.push(cur+1);
        }

        if(cur*2 >= 0 && cur*2 <= 200000 && dist[cur*2] == 0){ //*2 순간이동할때
            dist[cur*2] = dist[cur] + 1;
            q.push(cur*2);
        }
    }
}

 

 

결과

 

 

728x90
반응형

'알고리즘 > BFS DFS' 카테고리의 다른 글