백준의 숨바꼭질3(13549) 문제이다.
( 문제 바로가기 )
[ 문제풀이 ]
1) 아주 쉬운 BFS/DFS 문제이다. 본인은 BFS로 풀어보았다. 문제에서 사용한 배열로서 Visit[] 1차원 배열을 사용하였는데
단순히, true / false를 통해서 방문을 했다 안했다가 아닌, int형 배열로 선언해서 해당 점에 몇 초만에 갔는지
횟수를 저장해주었다.
2) 풀이는 간단하다. 시작점을 Queue에 넣어주고, Visit[시작점] = 0으로 설정해준다.
어떠한 움직임이 없어도 시작점에 있을 수 있기 때문에, Visit[시작점] = 0 이 된 것이다.
이 후, 순간이동을 하는 경우, 한칸 뒤로가는경우, 한칸 앞으로 가는 경우에 따라 알맞게 초를 계속해서 저장해주면서
진행하면 된다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include<iostream> #include<queue> #define endl "\n" #define MAX 100000 + 1 #define INF 999999999 using namespace std; int N, K; int Visit[MAX]; void Input() { cin >> N >> K; for (int i = 0; i < MAX; i++) { Visit[i] = INF; } } int BFS() { queue<int> Q; Q.push(N); Visit[N] = 0; while (Q.empty() == 0) { int Pos = Q.front(); Q.pop(); if (Pos == K) return Visit[K]; if (Pos + 1 < MAX && Visit[Pos + 1] > Visit[Pos] + 1) { Visit[Pos + 1] = Visit[Pos] + 1; Q.push(Pos + 1); } if (Pos - 1 >= 0 && Visit[Pos - 1] > Visit[Pos] + 1) { Visit[Pos - 1] = Visit[Pos] + 1; Q.push(Pos - 1); } if (Pos * 2 < MAX && Visit[Pos * 2] > Visit[Pos]) { Visit[Pos * 2] = Visit[Pos]; Q.push(Pos * 2); } } } void Solution() { int R = BFS(); cout << R << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 10819 ] 차이를 최대로 (C++) (0) | 2019.01.24 |
---|---|
[ 백준 9328 ] 열쇠 (C++) (4) | 2019.01.24 |
[ 백준 1799 ] 비숍 (C++) (4) | 2019.01.22 |
[ 백준 11051 ] 이항계수2 (C++) (0) | 2019.01.21 |
[ 백준 3980 ] 선발 명단 (C++) (0) | 2019.01.21 |