티스토리 뷰
#include <stdio.h>
int main(void)
{
int f, s, g, u, d;
scanf("%d %d %d %d %d", &f, &s, &g, &u, &d);
int visit[f+1];
for(int i = 0; i<=f; i++) visit[i] = 0;
int q[1000001];
int qcnt = 0;
int ans[1000001] = {0};
int acnt = 0;
int ptr = 0;
ans[acnt] = 1;
q[qcnt++] = s;
visit[s] = 1;
while(1)
{
if(ptr == qcnt) break;
if(q[ptr] == g) {
printf("%d", acnt);
return 0;
}
if(q[ptr] + u <= f && visit[q[ptr] + u] == 0) {
ans[acnt+1]++;
visit[q[ptr] + u] = 1;
q[qcnt++] = q[ptr] + u;
}
if(q[ptr] - d > 0 && visit[q[ptr] - d] == 0) {
ans[acnt+1]++;
visit[q[ptr] - d] = 1;
q[qcnt++] = q[ptr] - d;
}
ptr++;
if(--ans[acnt] == 0) acnt++;
}
printf("use the stairs");
return 0;
}
5014번: 스타트링크
첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.
www.acmicpc.net
풀이 ( BFS 이용)
0) 한 번 지나간 층은 다시는 지나가지 않으므로 (최소한의 횟수로 g을 가야 하기 때문이다)
visit[] 배열을 통해 다시 지나가는 것을 방지해 준다.
1) 1~f 의 범위 내에서 u만큼 증가, 또는 d만큼 감소시킨다.
2) 1) 과정 중에, g에 도달하게 되면 그 즉시 bfs을 종료한다.
3) 2)을 만족시키지 못하고, 큐에 아무것도 남지 않게 되면 (ptr == qcnt) ,
BFS을 종료하고 use the stairs을 출력한다.
위 코드에서의 BFS 설명 (야매로 만든 BFS)
q[] : queue 말 그대로 큐
qcnt : 큐의 크기, 하나가 들어올 때마다 1씩 증가
ans[] : BFS에서의 층(?)마다 몇 개의 노드가 있는지를 담는 배열
acnt : BFS에서의 층(?)을 나타냄
ex) 1 -> 2 -> 3
-> 4
여기서 3, 4는 두 번째 층
코드에서 if(--ans[acnt] == 0) acnt++;
을 통해 층에 있는 모든 노드를 지나가면 층을 내려간다.
visit[] : 방문 안 했다면 0, 그렇지 않으면 1
ptr : BFS에서 큐를 차례차례 살펴보기 위한 변수
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 25597번 푸앙이와 러닝머신 (0) | 2022.09.22 |
---|---|
c언어 1074번 Z (백준) (0) | 2022.08.24 |
c언어 14852번 타일 채우기 (백준) (0) | 2022.08.20 |
c언어 17505번 링고와 순열 (백준) (0) | 2022.07.09 |
c언어 2004번 조합 0의 개수 (백준) (0) | 2022.07.09 |
- Total
- Today
- Yesterday
- 덱
- 기하학
- BFS
- 정렬
- union
- C언어
- 최소 스패닝 트리
- 세그먼트 트리
- 그래프
- java
- Segment Tree
- 누적합
- XOR
- 플로이드
- 스택
- PASCAL
- Krustal
- DFS
- C++
- 그리디
- 브루트포스
- 백준
- find
- 최대공약수
- DP
- 오프라인 쿼리
- 1835번
- 1835
- 누적 합
- Lazy Propagation
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |