-
[백준][1697] 숨바꼭질Algorithm/백준 2020. 4. 2. 22:21
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지
www.acmicpc.net
풀이과정
1. x + 1, x -1, x *2의 이동방향을 가지는 주인공이 도착지에 도착하는 가장 빠른 길이를 구하는 문제이다.
2. bfs를 통하여 문제를 풀었다.
3. que를 비워줄때 마다 step이 증가하고 최초로 visited[목적지]를 방문하는 step이 정답이 된다.
소스코드
더보기#include <stdio.h> #include <algorithm> #include <queue> #include <string.h> #define MAX_VAL 100001 using namespace std; int x, y; int visited[100001]; int step = 0; int solution() { queue<int> que; que.push(x); visited[x] = 1; int count = 0; while (!que.empty()) { int queSize = que.size(); count++; if (visited[y] != 0) { break; } for (int i = 0; i < queSize; i++) { int cur = que.front(); que.pop(); if (cur + 1 < MAX_VAL && visited[cur + 1] == 0) { visited[cur + 1] = count; que.push(cur + 1); } if (cur * 2 < MAX_VAL && visited[cur * 2] == 0) { visited[cur * 2] = count; que.push(cur * 2); } if (cur - 1 >= 0 && visited[cur - 1] == 0) { visited[cur - 1] = count; que.push(cur - 1); } } } return visited[y]; } int main() { scanf("%d %d", &x, &y); if (x == y) { printf("0\n"); } else { printf("%d\n", solution()); } return 0; }
'Algorithm > 백준' 카테고리의 다른 글
[백준][13460번] 구슬 탈출 2 (0) 2020.04.13 [백준][12851] 숨바꼭질2 (0) 2020.04.02 [백준][1965번] 상자넣기 (0) 2020.03.29 [백준][1904번] 01타일 (0) 2020.03.29 [백준][1699번] 제곱수의 합 (0) 2020.03.26