문제링크 : https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, K;
vector<int> dist(100001, MAX);
void Dijkstra()
{
queue<int>q;
q.push(N);
dist[N] = 0;
while(!q.empty())
{
int cur = q.front();
q.pop();
if(cur == K) return;
if(cur - 1 >=0 && dist[cur-1] > dist[cur] + 1) //뒤로 걷기, 1초 이동
{
dist[cur-1] = dist[cur] + 1;
q.push(cur-1);
}
if(cur + 1 <=100001 && dist[cur+1] > dist[cur] + 1) //앞으로 걷기, 1초 이동
{
dist[cur+1] = dist[cur] + 1;
q.push(cur+1);
}
if(cur*2 <100001 && dist[cur*2] > dist[cur]) //순간이동, 0초 이동
{
dist[cur*2] = dist[cur];
q.push(cur*2);
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
Dijkstra();
cout << dist[K];
return 0;
}
처음에 우선순위 큐로 풀었다가 다익스트라가 더 깔끔해보여서 다익스트라로 한번 더 제출했다.
걷는 방향은 앞으로 걷기, 뒤로 걷기, 순간이동 이렇게 총 3가지이다.
각각의 경우에 대해서 비용을 갱신해주고, 목표 위치에 도달했을 때 종료하고 현재 위치의 비용을 출력해준다.
'백준 > 골드' 카테고리의 다른 글
[백준 1916번] 최소비용 구하기 (C++) (0) | 2023.06.25 |
---|---|
[백준 14908번] 구두 수선공 (C++) (0) | 2023.06.24 |
[백준 14943번] 벼룩 시장 (C++) (0) | 2023.06.20 |
[백준 21870번] 시철이가 사랑한 GCD (C++) (0) | 2023.06.16 |
[백준 2038번] 골롱 수열 (C++) (0) | 2023.06.07 |