문제 보러가기 : https://www.acmicpc.net/problem/12851
이번 문제는 너비 우선 탐색(BFS) 문제였습니다.
《문제 풀이》
1. { N, 0 } 을 큐에 삽입 (0은 경과 시간)
2. 동생을 가장 빠른 시간으로 찾는 방법의 수를 구해야 하므로 pop 이후에 방문 체크
3. 수빈이가 갈 수 있는 세 가지 위치가 범위에 충족되면 큐에 삽입
4. 최초로 동생 위치에 도달한 경우, 경과 시간을 result에 저장 후, cnt = 1
5. 이전에 동생 위치에 도달한 적이 있는 경우, cnt++
《C++ 코드》
#include <iostream>
#include <queue>
#define MAX 100001
using namespace std;
int cnt;
int result;
bool visited[MAX];
void hiding(int from, int to) {
queue<pair<int, int>> q;
q.push({from, 0});
visited[from] = true;
while(!q.empty()) {
int loc = q.front().first;
int time = q.front().second;
q.pop();
visited[loc] = true;
// 이전에 동생위치에 도달한적이 있는 경우
if(result == time && loc == to)
cnt++;
// 최초로 동생위치에 도달한 경우
if(!result && loc == to) {
result = time;
cnt = 1;
}
if(0 <= loc-1 && !visited[loc-1])
q.push({loc-1, time+1});
if(loc+1 < MAX && !visited[loc+1])
q.push({loc+1, time+1});
if(loc*2 < MAX && !visited[loc*2])
q.push({loc*2, time+1});
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int N, K;
cin>>N>>K;
hiding(N, K);
cout<<result<<"\n"<<cnt;
return 0;
}
개발 환경: Dev-C++
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 10830번 행렬 제곱 (0) | 2021.01.18 |
---|---|
백준 13549번 숨바꼭질 3 (0) | 2021.01.16 |
백준 16953번 A → B (0) | 2021.01.16 |
백준 15663번 N과 M (9) (0) | 2021.01.11 |
[백준] 15654번 N과 M (5) C++ (0) | 2021.01.09 |