백준 12851 숨바꼭질 2 - c++

JangGwon·2022년 8월 4일
0

문제 링크 : https://www.acmicpc.net/problem/12851

문제 설명

먼저 BFS를 이용하여 동생이 발견되는 경우 중 최소 시간을 구한 후 이 시간과 중복되는 경우를 찾아 카운트 했습니다.

소스코드

#include <iostream>
#include <queue>

using namespace std;

int a, b;
int result, num;
bool used[1000001];

void bfs()
{
    queue<pair<int,int> > q;
    q.push(make_pair(a,0));
    while (!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        used[x] = true;
        if (result && x == b && result == y)        // 최초 발견 이후 다른 방법으로 찾았을때, 경우의수 올리기. 
        {
            num++;
        }
        if (!result && x == b)  // 최초 발견 , 동생을 최단 시간 내에 찾았을 때,
        {
            result = y;
            num++;
        }
            if (x - 1 >= 0 && !used[x - 1])         // X가 -1을 했을때 0 밑으로 떨어지지 않을시 x-1 큐에 넣기
            {
                q.push(make_pair(x-1,y+1));
            }
            if (!used[x+1] && x + 1 <= 100000)      // X가 +1을 했을때 100000 위로 초과하지 않을시 x+1 큐에 넣기
            {
                q.push(make_pair(x+1,y+1));
            }
            if (!used[x*2] && x * 2 <= 100000)    // X가 *2을 했을때 100000 위로 초과하지 않을시 x*2 큐에 넣기
            {
                q.push(make_pair(x*2,y+1));
            }
    }
}

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

    cin >> a >> b;
    bfs();

    cout << result << "\n" << num;
    return 0;
}

0개의 댓글