문제 링크 : 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;
}