본문 바로가기

알고리즘/백준

백준 1697 숨바꼭질 - bfs - c++

728x90

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

한 7번;; 만에 풀었다.

큐에다가 bfs를 진행하면서 넣고 빼고를 반복하면서 카운팅만 잘 해주면 풀 수 있는 문제지만

따져야 되는 조건들을 안따질 시 런타임 에러가 난다.

 

조심해야 할점 -

  • queue에서 push는 뒤에서 이뤄지고, pop은 앞에 거에서 이뤄진다.
  • 처음에는 bool visited[100002]를 사용하지 않고 풀었는데, 이렇게 될시에는 방문했던 노드도 큐에 다시 넣어진다. 이렇게 될 시에는 O(3**n) 의 시간복잡도로 코드가 돌아가서 메모리 초과가 발생 할 수 있다.
  • 각각 큐에 push를 할때 if 조건을 잘 따져봐야 한다. 3가지 경우 모두다. 본인은  item +1<=100000 조건을 생각 못하고 풀어서 계속 틀렸었다.

이러한 조건들을 반드시 풀면서 생각해보도록 하자 ㅜㅜ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <queue>
using namespace std;
int result=0;
int n,k;
bool visited[100002];
 
void bfs(int current){
    queue<int> dq;
    visited[current]=true;
    while(!dq.empty()){
        int size = dq.size();
        for(int i=0; i<size; i++){
            int item = dq.front();
//            cout<<item<<"\n";
            dq.pop();
            if(item==k)
                return;
            else{
                if(item +1<=100000) {
                    if (!visited[item + 1]) {
                        dq.push(item + 1);
                        visited[item + 1= true;
                    }
                }
                if (item - 1 >= 0) {
                    if(!visited[item-1]) {
                        dq.push(item - 1);
                        visited[item-1]=true;
                    }
                }
                if(2*item<=100000) {
                    if (!visited[2 * item]) {
                        dq.push(2 * item);
                        visited[2 * item] = true;
                    }
                }
            }
        }
        result++;
    }
}
 
int main(void){
    cin>>n>>k;
    bfs(n);
    cout<<result;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter