https://www.acmicpc.net/problem/1697
풀이
목표값으로 가기위한 최단거기를 찾는 문제로 BFS문제이다. 물론 다른 방법도 있겠지만..나는 주로 최단거리 문제는 BFS로 풀려고한다.
문제에서 말하는 1초가 추가될 때마다 1층씩 더 추가해가는 것으로 생각하고 풀면된다.
문제에서 x-1, x+1,x*2 총 3가지의 갈래가 있다. 여기서 방문했던 곳을 또 방문하여 큐에 저장하는 것은 불필요하므로 방문배열을 하나 더 만들어 방문 체크를 하도록하자.
작성한 코드
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 | #include <stdio.h> int N, K, L, Q[250000], visit[100001], front = -1, back = -1, count, token; int d[100001];//층을 표시하기 위한 배열. int main() { scanf("%d %d", &N, &K); if (N == K) { printf("0"); return 0; } Q[++back] = N; while (front != back) { count++; front++; if (visit[Q[front] * 2] == 0 && (Q[front] * 2)<100001 && (Q[front] * 2 >= 0)) { Q[++back] = Q[front] * 2; d[back] = d[front] + 1; visit[Q[back]] = 1; } if (Q[back] == K){ break; } if (visit[Q[front] - 1] == 0 && (Q[front] - 1<100001) && (Q[front] - 1 >= 0)) { Q[++back] = Q[front] - 1; d[back] = d[front] + 1; visit[Q[back]] = 1; } if (Q[back] == K) { break; } if (visit[Q[front] + 1] == 0 && (Q[front] + 1<100001) && (Q[front] + 1 >= 0)) { Q[++back] = Q[front] + 1; d[back] = d[front] + 1; visit[Q[back]] = 1; } if (Q[back] == K){ break; } } printf("%d", d[back]); return 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[BAEKJOON] 2089_-2진수_C언어 (0) | 2017.08.01 |
---|---|
[BAEKJOON] 1107_리모컨_C언어 (1) | 2017.08.01 |
[BAEKJOON] 9934_완전 이진 트리_C언어 (2) | 2017.08.01 |
[BEAKJOON] 1182_부분집합의 합_C언어 (0) | 2017.07.27 |
[BAEKJOON] 11723_집한_C언어 (0) | 2017.07.25 |