Baekjoon Review
[Gold 4] 12851 숨바꼭질 2
hanseongbugi
2024. 9. 20. 15:00
https://www.acmicpc.net/problem/12851
이 문제는 BFS를 사용하면 해결할 수 있다.
수빈이가 움직일 수 있는 경우의 수는 3가지다.
뒤로 1칸, 앞으로 1칸, 2배 전진하는 경우이다.
따라서 dir 배열 속에 {-1, 1, 0}을 넣고 0인 경우 2배 전진하도록 한다.
현재 위치가 동생의 위치인 경우 최소 시간과 현재 시간을 비교하여
최소 시간이 더 큰 경우 동생을 찾을 수 있는 수를 1로 초기화 하고 최소 시간을 갱신한다.
만약 최소 시간이 현재 시간과 같다면 동생을 찾을 수 있는 수를 1 증가시킨다.
#include <iostream>
#include <queue>
using namespace std;
int N, K;
int minTime = 987654321;
int answer = 0;
bool visited[100001];
int dir[3] = {-1, 1, 0};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>N>>K;
queue<pair<int,int>> q;
q.push({N,0});
while(!q.empty()){
int now = q.front().first;
int time = q.front().second;
q.pop();
visited[now] = true;
if(now == K){
if(minTime > time){
minTime = time;
answer = 1;
}
else if(minTime == time)
answer++;
}
for(int i = 0;i<3;i++){
int next;
if(dir[i] == 0)
next = now * 2;
else
next = now + dir[i];
if(next > 100000 || next < 0)
continue;
if(!visited[next]){
q.push({next, time + 1});
}
}
}
cout<<minTime<<'\n'<<answer;
}