백준 13549 - 숨바꼭질3
문제
백준 13549 - 숨바꼭질3 풀러가기
문제 분석
이 문제의 경우에는 모든 연산이 1초 가 아니다.
bfs는 모든 가중치가 1인 경우에 적용할 수 있다고 생각하여 bfs로 풀 수 없다고 생각 할 수 있는데, 그렇지 않다.
큐를 2개 이용하거나, 덱을 이용하면 bfs로 풀 수 있다.
문제 풀이(C++)
-
전체 코드(큐 2개)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <cstdio>#include <queue>#include <cstring>using namespace std;int cnt[100001];queue<int> q1;queue<int> q2;void bfs() {while (!q1.empty()) {int c = q1.front();if (c * 2 <= 100000 && cnt[c * 2] == -1) {cnt[c * 2] = cnt[c];q1.push(c * 2);}if (c - 1 >= 0 && cnt[c - 1] == -1) {cnt[c - 1] = cnt[c] + 1;q2.push(c - 1);}if (c + 1 <= 100000 && cnt[c+ 1] == -1) {cnt[c + 1] = cnt[c] + 1;q2.push(c + 1);}q1.pop();}}int main() {int n, k;scanf("%d %d", &n, &k);memset(cnt, -1, sizeof(cnt));cnt[n] = 0;q1.push(n);while (cnt[k] == -1) {bfs();q1 = q2;q2 = queue<int>();}printf("%d", cnt[k]);return 0;}cs -
전체 코드(덱 사용)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include <cstdio>#include <cstring>#include <deque>using namespace std;int cnt[100001];deque<int> d;void bfs() {while (!d.empty()) {int c = d.front();d.pop_front();if (c * 2 <= 100000 && cnt[c * 2] == -1) {cnt[c * 2] = cnt[c];d.push_front(c*2);}if (c - 1 >= 0 && cnt[c - 1] == -1) {cnt[c - 1] = cnt[c] + 1;d.push_back(c - 1);}if (c + 1 <= 100000 && cnt[c + 1] == -1) {cnt[c + 1] = cnt[c] + 1;d.push_back(c + 1);}}}int main() {int n, k;scanf("%d %d", &n, &k);memset(cnt, -1, sizeof(cnt));cnt[n] = 0;d.push_back(n);bfs();printf("%d", cnt[k]);return 0;}cs
연관 문제
-
아직 배움의 과정에 있는 학생이니 내용에 부족한 점이 보이면 지적은 하되, 비난은 하지 말아주세요!!
</html>
댓글남기기