Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 괄호추가하기
- 미세먼지 안녕!
- 로또
- 14502
- 알고리즘
- 16637
- 9095
- 인스타
- 따라하기
- Ajax
- 17143
- 17144
- 구슬탈출2
- 6603
- 좋아요
- 재귀
- django
- 댓글
- 1182
- 백준
- 14888
- 다리 만들기2
- 17136
- Java
- 장고
- 연산자 끼워넣기
- 색종이 붙이기
- 17472
- 부분수열의 합
- 인스타그램
Archives
- Today
- Total
Be a developer
백준 13549 숨바꼭질 3 본문
bfs는 모든 가중치가 1일 때 가능하다.
앞서 풀었던 숨바꼭질 문제는 수빈이가 이동할 때 모두 1초가 걸렸기 때문에 가능했다.
하지만 이번 문제는 0초에 이동할 수 있어서 가중치가 0인 경우가 있다.
원래 bfs는 queue에 넣는 건데, 다 가중치가 1이기 때문에 거리가 1일 때, 거리가 2일 때 차곡차곡 쌓인다.
하지만 가중치가 다르면 꺼냈을 때 값이 뒤죽박죽이 된다.
이럴 경우에 queue를 여러 개 사용해서 푼다.
즉, 0초 일 때 넣을 queue와 1초 일 때 넣을 queue 총 2개를 사용해서 문제를 푼다.
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 | #include <iostream> #include <queue> #include <deque> using namespace std; bool c[1000000]; int d[1000000]; int MAX = 1000000; int main() { int n, m; cin >> n >> m; c[n] = true; d[n] = 0; queue<int> q; queue<int> next_queue; q.push(n); while (!q.empty()) { int now = q.front(); q.pop(); if (now*2 < MAX) { if (c[now*2] == false) { q.push(now*2); c[now*2] = true; d[now*2] = d[now]; } } if (now-1 >= 0) { if (c[now-1] == false) { next_queue.push(now-1); c[now-1] = true; d[now-1] = d[now] + 1; } } if (now+1 < MAX) { if (c[now+1] == false) { next_queue.push(now+1); c[now+1] = true; d[now+1] = d[now] + 1; } } if (q.empty()) { q = next_queue; next_queue = queue<int>(); } } cout << d[m] << '\n'; return 0; } | cs |
'알고리즘' 카테고리의 다른 글
백준 2206 벽 부수고 이동하기 (0) | 2019.04.08 |
---|---|
백준 1261 알고스팟 (0) | 2019.04.08 |
백준 14226 이모티콘 (0) | 2019.04.07 |
백준 1697 숨바꼭질 (0) | 2019.04.07 |
백준 7576 토마토 (0) | 2019.04.07 |
Comments