[백준 1697번 C/C++] 숨바꼭질
[백준 1697번 C/C++] 숨바꼭질
https://www.acmicpc.net/problem/1697
해결전략
너비우선탐색, BFS
코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, k; //n: 수빈 현재 점, k: 동생 점
queue<pair<int,int>> Q; // 첫 번째 원소는 위치, 두 번째 원소는 해당 위치에 도달하기까지 걸린 시간
vector<int> ch; //해당 위치를 방문했는지 여부를 체크
int minSec = 2147000000;
void BFS(int n, int k)
{
//시작점인 수빈이의 위치와 초(sec)를 삽입하고 방문 처리
Q.push({ n, 0 });
ch[n] = 1;
while (!Q.empty())
{
int x = Q.front().first;
int sec = Q.front().second;
Q.pop();
//현재 위치가 목표인 동생의 위치와 같다면 지금까지 걸린 시간(sec)을 출력하고 함수를 종료
if (x == k){
cout << sec;
return;
}
if (ch[x-1]==0 && 0 < x-1)
{
Q.push({ x - 1, sec + 1 });
ch[x - 1] = 1;
}
if (ch[x+1]==0 && x+1 < k * 2)
{
Q.push({ x + 1, sec + 1 });
ch[x + 1] = 1;
}
if (ch[x*2]==0 && x*2 < k * 2)
{
Q.push({ x * 2, sec + 1 });
ch[x * 2] = 1;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> k;
ch.resize(100000);//충분히 크게 잡아줘야 한다.
BFS(n, k);
return 0;
}
더 간결한 코드
#include <iostream>
using namespace std;
int min(int a, int b) {
return a < b ? a : b;
}
int BFS(int n, int k)
{
if (n <= k)
return k - n;
else if (n == 1)
return 1;
else if (n % 2)
return 1 + min(BFS(n - 1, k), BFS(n + 1, k));
else
return min(n - k, 1 + BFS(n / 2, k));
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, k;
cin >> n >> k;
cout << BFS(n, k);
}
H3 중제목
본문내용넣기
마무리
마무리
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 2206번 C/C++] 벽 부수고 이동하기 (0) | 2023.09.20 |
---|---|
[백준 7562번 C/C++] 나이트의 이동 (0) | 2023.09.01 |
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2 (0) | 2023.08.29 |
[백준 2580번 C/C++] 스도쿠 (0) | 2023.08.20 |
[백준 1012번 C/C++] 유기농 배추 (0) | 2023.08.18 |
댓글
이 글 공유하기
다른 글
-
[백준 2206번 C/C++] 벽 부수고 이동하기
[백준 2206번 C/C++] 벽 부수고 이동하기
2023.09.20 -
[백준 7562번 C/C++] 나이트의 이동
[백준 7562번 C/C++] 나이트의 이동
2023.09.01 -
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
[백준 12015번 C/C++] 가장 긴 증가하는 부분 수열 2
2023.08.29 -
[백준 2580번 C/C++] 스도쿠
[백준 2580번 C/C++] 스도쿠
2023.08.20