알고리즘 :: 큰돌 :: Chapter 3 - 완전탐색/백트래킹 :: 백준 13913 숨바꼭질4

Embedded June·2023년 7월 8일
0
post-thumbnail

문제

문제 링크

해설

  • 이 문제는 다른 포스트에서 이미 다룬 적이 있기 때문에 해당 포스트 주소를 올리는 것으로 대체하겠습니다.

코드

#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

int N, K;
int visited[100'001];

void get_trace(int here, int there) {
    if (here != there) get_trace(here, visited[there]);
    cout << there << ' ';
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    cin >> N >> K;

    if (N > K) {    // 거꾸로 가는 방법은 1가지 밖에 없습니다.
        cout << N - K << '\n';
        for (int i = N; i >= K; i--) cout << i << ' ';
        return 0;
    }

    int answer_time = 1e9;

    queue<pair<int, int>> q;
    q.emplace(N, 0);
    // 인덱스 '0'번이 유효한 번호기 때문에 -1로 초기화해야 합니다!
    memset(visited, -1, sizeof(visited));
    visited[N] = N;
    while (!q.empty()) {
        int here = q.front().first, now = q.front().second;
        q.pop();
        if (now > answer_time) continue;
        if (here == K) { answer_time = now; break; }
        for (int there : {here * 2, here + 1, here - 1}) {
            if (0 <= there && there <= 100'000 && visited[there] == -1) {
                q.emplace(there, now + 1);
                visited[there] = here;
            }
        }
    }
    cout << answer_time << '\n';
    get_trace(N, K);

    return 0;
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글