-
[1697] 숨바꼭질BOJ 2021. 10. 1. 16:47
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
아래 문제와 함께보길 권장합니다.
https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
<문제>
현재 정점에서 다음 정점은 문제에 나와있듯, X-1, X+1, 2*X중 하나이고, 모두 1초가 걸립니다.
그렇기에 어떠한 순서이든 관계없이, 재방문을 허용하지 않는다는 부분만 주의하여 구현하면 됩니다.
<소스코드>
123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <stdio.h>#include <algorithm>#include <queue>using namespace std;queue<int> q;const int INF = 2121212121;const int SIZE = 350000;int n, k;int dp[350003];bool visit[350003];int main(void) {int cur = 0, cnt = 0, i;scanf("%d %d", &n, &k);if (n == k) {printf("0");return 0;}q.push(n);for (i = 0; i <= SIZE - 1; i++) dp[i] = INF;dp[n] = 0;visit[n] = true;while (1) {cur = q.front();q.pop();if (cur == k) break;if (cur * 2 <= SIZE && cur * 2 >= 0 && !visit[cur * 2]) {visit[cur * 2] = true;q.push(cur * 2);dp[cur * 2] = min(dp[cur] + 1, dp[cur * 2]);}if (cur + 1 <= SIZE && cur + 1 >= 0 && !visit[cur + 1]) {visit[cur + 1] = true;dp[cur + 1] = min(dp[cur] + 1, dp[cur + 1]);q.push(cur + 1);}if (cur - 1 <= SIZE && cur - 1 >= 0 && !visit[cur - 1]) {visit[cur - 1] = true;q.push(cur - 1);dp[cur - 1] = min(dp[cur] + 1, dp[cur - 1]);}}printf("%d", dp[k]);return 0;}cs 'BOJ' 카테고리의 다른 글
[1261] 알고스팟 (0) 2021.10.02 [9019] DSLR (0) 2021.10.02 [9012] 괄호 (0) 2021.10.01 [4344] 평균은 넘겠지 (0) 2021.10.01 [2609] 최대공약수와 최소공배수 (0) 2021.10.01