반응형
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
출처:https://www.acmicpc.net/problem/1697
문제 해결 과정:
- 백트랙킹 문제
- 처음에 재귀를 이용한 dfs로 풀다가 안되서 bfs사용
- 3가지 경우를 각각 큐에 넣어서 하나씩 꺼내서 체크한다
- K보다 N이 클 경우는 뒤로 한칸씩 가는 방법 밖에 없으므로 K-N이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include<iostream> #include<cstdio> #include<queue> using namespace std; bool visited[100001] = { false, }; int dir[3] = { -1,0,1 }; int Move(int K,int N) { queue<pair<int,int>> q; visited[N] = true; q.push(pair<int, int>(N,0)); while (!q.empty()) { int pos = q.front().first; int cnt = q.front().second; q.pop(); if (pos == K) { return cnt; } for (int i = 0; i < 3; i++) { int next; if (dir[i] != 0) { next = pos + dir[i]; } else { next = pos * 2; } if (0 <= next && next <= 100000) { if (!visited[next]) { q.push(pair<int, int>(next, cnt + 1)); visited[next] = true; } } } } return 0; } int main() { int N, K; scanf_s("%d %d", &N, &K); if (K <= N) { printf("%d", N - K); } else { printf("%d\n", Move(K,N)); } return 0; } | cs |
반응형
'알고리즘' 카테고리의 다른 글
<백준> 1152번 단어의 개수 (0) | 2017.12.29 |
---|---|
<백준> 2798번 블랙잭 (0) | 2017.12.28 |
<백준> 1931번 회의실 배정 (0) | 2017.12.26 |
<백준> 2839번 설탕 배달 (0) | 2017.12.25 |
<백준> 2875번 대회 or 인턴 (0) | 2017.12.23 |