반응형
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
둘째 줄에 어떻게 이동해야 하는지 공백으로 구분해 출력한다.
BFS에서 최단 거리 루트 출력 방법
parent 배열에 현재 좌표가 cur이고 넘어가는 값이 next라면
parent[next] = cur로 기록
그렇게 목적지에 도착하면 cur은 목적지인 상태.
cur이 출발지가 되지 않는 동안 cur을 vector에 저장하고, cur을 parent[cur]로 갱신해줌 ( 조상을 타고 올라감)
그리고 벡터 마지막에 출발점을 push하고 거꾸로 출력하면 됨.
만약 parent로 안하고 order[현재좌표] = 다음좌표로 해서
출발점부터 타고간다고 하면 오류남 -> BFS는 동시탐색이라 order[N]이 바로 아래에서 덮어쓰여짐
#include <iostream>
#include <vector>
#include<string.h>
#include<queue>
#include <string>
#include<stack>
#include<cmath>
#include <map>
#include<algorithm>
using namespace std;
int parent[100001];
bool visit[100001];
int N, K;
vector<int> order;
int start()
{
queue<pair<int, int> > que;
que.push({ 0,N });
while (!que.empty())
{
int cost = que.front().first;
int cur = que.front().second;
que.pop();
if (cur == K)
{
while (cur != N)
{
order.push_back(cur);
cur = parent[cur];
}
return cost;
}
if (cur * 2 <= 100000)
{
if (!visit[cur * 2])
{
visit[cur * 2] = true;
parent[cur * 2] = cur;
que.push({ cost + 1,cur * 2 });
}
}
if (cur + 1 <= 100000)
{
if (!visit[cur + 1])
{
visit[cur + 1] = true;
parent[cur + 1] = cur;
que.push({ cost + 1,cur + 1 });
}
}
if (cur - 1 >= 0)
{
if (!visit[cur - 1])
{
visit[cur - 1] = true;
parent[cur - 1] = cur;
que.push({ cost + 1,cur - 1 });
}
}
}
}
int main() {
cin >> N >> K;
printf("%d\n", start());
order.push_back(N);
for (int i = order.size() - 1; i >= 0; i--)
{
printf("%d ", order[i]);
}
printf("\n");
}
반응형
'Algorithm' 카테고리의 다른 글
[트리 단계] 백준 1167번 트리의 지름 (0) | 2020.10.07 |
---|---|
[트리 단계] 백준 11725번 트리의 부모 찾기 (0) | 2020.10.07 |
[동적 계획법과 최단거리 역추적 단계] 백준 12852번 1로 만들기 2 (0) | 2020.10.06 |
[동적 계획법과 최단거리 역추적 단계] 백준 14003번 가장 긴 증가하는 부분 수열 5 (0) | 2020.10.06 |
[동적 계획법 3 단계] 백준 2098번 외판원 순회 (0) | 2020.10.05 |