비교적 쉬운 문제이다. 최단경로!!!! 이기 때문에 고민없이 BFS로 풀이를 시작했다.
1) 이 문제는 1차원 bfs문제이다.
2) bfs의 종료조건은 원하는 층에 도달했을 때
3) queue에 담는 조건은 최저층~최고층사이 이면서 방문한 적이 없는 애들
#include<iostream>
#include<queue>
using namespace std;
int F, S, G, U, D;
int dx[] = {0, 0};
int visit[1000001];
void bfs(int x, int d) {
queue<pair<int, int>> q;
visit[x] = 1;
q.push(make_pair(x, d));
while (!q.empty()) {
int cx = q.front().first;
int depth = q.front().second;
q.pop();
//cout << cx << "," << depth << endl;
//종료조건: 원하는 층에 도달했을 때
if (cx == G) {
cout << depth;
return;
}
for (int i = 0; i < 2; i++) {
int nx = cx + dx[i];
if (1 <=nx && nx<=F && visit[nx]==0) {
visit[nx] = 1;
int nd = depth + 1;
q.push(make_pair(nx, nd));
}
}
}
cout << "use the stairs";
return;
}
int main() {
cin >> F >> S >> G >> U >> D;
dx[0] = U;
dx[1] = -D;
bfs(S, 0);
return 0;
}
#include<iostream>
#include<queue>
using namespace std;
//#define MAX 1000000
int visit[1000001];
int F, G, S, U, D;
queue<pair<int, int>> q;
void bfs(int x) {
q.push(make_pair(x,0));
visit[x] = 1;
while (!q.empty()) {
int cx = q.front().first;
int cnt = q.front().second;
q.pop();
if (cx == G) {
cout << cnt;
return;
}
int nx_up = cx + U;
int nx_down = cx - D;
if (nx_up <= F && visit[nx_up] == 0) {
visit[nx_up] = 1;
q.push(make_pair(nx_up, cnt + 1));
}
if (nx_down >= 1 && visit[nx_down] == 0) {
visit[nx_down] = 1;
q.push(make_pair(nx_down, cnt + 1));
}
}
cout << "use the stairs";
return;
}
int main() {
cin >> F >> S >> G >> U >> D;
bfs(S);
return 0;
}
'Programming > BOJ' 카테고리의 다른 글
[백준/C++] 2636번: 치즈 (0) | 2020.09.04 |
---|---|
[백준/C++] 9205번: 맥주 마시면서 걸어가기 (0) | 2020.09.03 |
[백준/C++] 2468번: 안전영역 (1) | 2020.09.01 |
[백준/C++] 2573번: 빙산 (지저분쓰한 DFS풀이) (0) | 2020.09.01 |
[백준/C++] 7579번: 토마토 (0) | 2020.08.24 |