https://www.acmicpc.net/problem/1697
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
입출력 예제
코드
use std::collections::VecDeque;
use std::io;
fn bfs(n: usize, k: usize) -> usize {
let max_pos = 100_000;
let mut visited = vec![false; max_pos + 1];
let mut queue = VecDeque::new();
queue.push_back((n, 0));
visited[n] = true;
while let Some((position, time)) = queue.pop_front() {
if position == k {
return time;
}
let next_positions = [position.wrapping_sub(1), position + 1, position * 2];
for &next_pos in &next_positions {
if next_pos <= max_pos && !visited[next_pos] {
visited[next_pos] = true;
queue.push_back((next_pos, time + 1));
}
}
}
0
}
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
let mut iter = input.split_whitespace();
let n: usize = iter.next().unwrap().parse().unwrap();
let k: usize = iter.next().unwrap().parse().unwrap();
let result = bfs(n, k);
println!("{}", result);
}
'Koala - 15기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/c++] 4963 : 섬의 개수 (0) | 2024.08.12 |
---|---|
[백준/Python] 1260번: DFS와 BFS (0) | 2024.08.11 |
[백준/python] 1260 dfs와 bfs (0) | 2024.08.11 |
[백준/C++] 11660번: 구간 합 구하기 5 (0) | 2024.08.09 |
[백준/C++] 1644번: 소수의 연속합 (0) | 2024.08.09 |