반응형
https://www.acmicpc.net/problem/16928
이 문제 같은 경우는 탐색 BFS 알고리즘을 이용하면 쉽게 구현이 가능하다.
보드판 100칸 중에 사다리 혹은 뱀이 있을 경우 도착 지점을 적어두고 나머지는 0으로 해서 특수한 경우와 일반 경우를 구별해준다. bfs를 구현할 때는 큐에 좌표와 주사위를 굴릴 때마다 카운트 하는 변수를 넣어준다.
주사위가 1일때 부터 6일때까지 반복해주고 현재 좌표에 더해서 다음 좌표를 만든다.
다음 좌표가 100일 경우 카운트에 +1해서 출력해준다.
만약 100보다 작을 경우 먼저 다음 좌표에 사다리 혹은 뱀인지 확인해서 0이 아닌 경우 적혀있는 값으로 좌표를 이동해준다.
그 후 다음 좌표가 이전에 방문되어지지 않았다면 큐에 넣어주고 방문 처리를 해준다.
방문한 좌표를 다시 방문할 필요가 없는 이유는 먼저 방문한 애가 있다면 그 뒤에 온 좌표는 무조건 그 앞 좌표보다 느리고 중복이기 때문에 다시 방문할 필요가 없다.
전체 코드
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
48
49
|
#include <iostream>
#include <queue>
using namespace std;
int map[102] = {0};
bool visit[102] = {0};
void game(int x, int c){
queue<pair<int, int>> q;
q.push(make_pair(x, c));
while(!q.empty()){
int loc = q.front().first; // 현재 좌표
int cnt = q.front().second; // 카운트
q.pop();
for (int i = 1; i <= 6;i++){
int nx = loc + i; // 다음 좌표
if(nx == 100){
cout << cnt+1; // 도착했으면 출력
return;
}
else if(nx < 100){ // 100보다 작은 좌표라면
while(map[nx] != 0){ // 사다리 혹은 뱀인지 확인
nx = map[nx]; // 점프한 자리로 이동
}
if(!visit[nx]){ // 처음 방문한 좌표일때
q.push(make_pair(nx, cnt + 1)); // 큐에 넣어줌
visit[nx] = true; // 방문처리
}
}
}
}
}
int main(){
int n, m, t1, t2;
cin >> n >> m;
for (int i = 0; i < n;i++){
cin >> t1 >> t2;
map[t1] = t2; // 사다리 저장
}
for (int i = 0; i < m;i++){
cin >> t1 >> t2;
map[t1] = t2; // 뱀 저장
}
game(1, 0);
return 0;
}
|
cs |
체감 난이도 | 걸린 시간 | 참고 | 사용 알고리즘 |
중 | 38min | x | BFS |
후기 : 처음에 백트랙킹으로 잘못접근해서 시간초과가 생겨서 소요시간이 조금 걸렸다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 12851 숨박꼭질2 C++ [컴공과고씨] (0) | 2022.08.08 |
---|---|
백준 14889 스타트와 링크 c++ [컴공과고씨] (0) | 2022.05.05 |
백준 3190 뱀 c++ [컴공과고씨] (0) | 2022.04.22 |
백준 2493 탑 c++ [컴공과고씨] (0) | 2022.04.22 |
백준 13335 트럭 C++ [컴공과고씨] (2) | 2022.04.21 |