본문 바로가기

PS/백준

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

728x90

www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

5014번 스타트 링크랑 비슷한 문제입니다.

 

한 번의 BFS 때마다 -1, +1 , *2 << 이 세가지의 경우를 동시에 수행합니다.

cnt배열은 각 인덱스의 위치에 있을때, 거기로 갈 수 있는 최소의 이동횟수를 기록합니다.

 

if (way[i] >= 0 && way[i] <= 100000 && cnt[way[i]] == 0)

이 부분을 보면 cnt가 0일때, 즉 한번도 이 곳에 가는 횟수를 기록한 적이 없을때만 탐색을합니다.

 

만약 1에서 4라는 위치로 이동을 하기위해서는

+1 +1 +1  < 총 3번의 이동

*2  +1       <총 2번의 이동

 

어짜피 bfs에서는 한 번에 3가지 가능한 이동을 모두 해볼 수 있기 때문에

무조건 처음 도착할때 소모한 횟수가 최소값이됩니다.

즉 다음번에 다시 방문할때 소모한 횟수가 나온다면 무조건 초기값보다는 큰 값이므로 저장하거나 방문할 필요가 없습니다.

 

 

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
#include <iostream>
#include <queue>
 
using namespace std;
 
int n, k;
int cnt[100001];
queue<int> q;
 
int bfs() {
    q.push(n);
 
    while (!q.empty()) {
        int subin = q.front();
        q.pop();
        //탈출조건
        if (subin == k)
            return cnt[subin];
        //수빈이 이동할 수 있는 방법 3가지를 배열화
        int way[3= { subin + 1, subin - 12 * subin };
 
        for (int i = 0; i < 3; i++) {
            if (way[i] >= 0 && way[i] <= 100000 && cnt[way[i]] == 0) {
                q.push(way[i]);
                cnt[way[i]] = cnt[subin] + 1;
            }
        }
    }
}
int main() {
    cin >> n >> k;
    
    cout << bfs();
    return 0;
}
cs

728x90

'PS > 백준' 카테고리의 다른 글

[백준 1003번] 피보나치 함수 C++  (0) 2021.05.12
[백준 1463번] 1로 만들기 C++  (0) 2021.04.12
[백준 7576번] 토마토 C++  (0) 2021.03.19
[백준 2206번] 벽 부수고 이동하기 C++  (0) 2021.03.19
[백준 3055번] 탈출 C++  (0) 2021.03.18