No Rules Rules

숨바꼭질 2 (feat. 백준, 12851번) 본문

생활/코테

숨바꼭질 2 (feat. 백준, 12851번)

개발하는 완두콩 2023. 1. 27. 08:27
728x90
반응형

숨바꼭질 2
https://www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

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

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
pair<int, int> arr[100001];         // N으로부터 총 횟수, 방법
void bfs(register int n, register int k){
    queue<pair<int, int>> q;        // 위치, 위치까지 온 누적 횟수
    q.push(make_pair(n, 0));
    if(n == k){
        ++arr[n].second;
        return;
    }
    while(!q.empty()){
        auto v = q.front(); q.pop();
        auto pos = v.first, cnt = v.second;
        if(pos - 1 >= 0){
            if(cnt + 1 == arr[pos - 1].first)
                q.push(make_pair(pos - 1, cnt + 1)), ++arr[pos - 1].second;
            else if((arr[pos - 1].first == 0 && arr[pos - 1].second == 0) || cnt + 1 < arr[pos - 1].first)
                q.push(make_pair(pos - 1, cnt + 1)), arr[pos - 1].first = cnt + 1, arr[pos - 1].second = 1;
        }
        if(pos + 1 <= 100000){
            if(cnt + 1 == arr[pos + 1].first)
                q.push(make_pair(pos + 1, cnt + 1)), ++arr[pos + 1].second;
            else if((arr[pos + 1].first == 0 && arr[pos + 1].second == 0) || cnt + 1 < arr[pos + 1].first)
                q.push(make_pair(pos + 1, cnt + 1)), arr[pos + 1].first = cnt + 1, arr[pos + 1].second = 1;
        }
        if(0 < pos && (pos << 1) <= 100000){
            if(cnt + 1 == arr[pos << 1].first)
                q.push(make_pair(pos << 1, cnt + 1)), ++arr[pos << 1].second;
            else if((arr[pos << 1].first == 0 && arr[pos << 1].second == 0) || cnt + 1 < arr[pos << 1].first)
                q.push(make_pair(pos << 1, cnt + 1)), arr[pos << 1].first = cnt + 1, arr[pos << 1].second = 1;
        }
    }
}
int main() {
	ios::sync_with_stdio(false), cin.tie(NULL);
    register int N, K;
    cin >> N >> K;
    bfs(N, K);
    cout << arr[K].first << "\n" << arr[K].second;
    return 0;
}
// *&)*@*

 

반응형
  1. 문제의 조건과 같이 N 자리에서 -1, +1, *2 의 경우에 대해서 걸린 시간과 이동 가능한 횟수를 기록합니다.
  2. 단, N == K인 경우, 걸린 시간은 0초이고 이동 가능한 횟수는 N == K 밖에 없으므로 0 1 을 출력해야 합니다.
728x90
반응형

'생활 > 코테' 카테고리의 다른 글

장기자랑 (feat. 백준, 27277번)  (0) 2023.01.27
피시방 알바 (feat. 백준, 1453번)  (0) 2023.01.27
비밀편지 (feat. 백준, 2596번)  (0) 2023.01.26
A+B - 6 (feat. 백준, 10953번)  (0) 2023.01.25
2007년 (feat. 백준, 1924번)  (0) 2023.01.25
Comments