티스토리 뷰

코드

1) pair 이용
현재 위치와 해당 위치까지 이동하는 데 걸린 시간을 함께 저장하기 위해 pair를 이용한다.

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
#include <iostream>
#include <queue>
using namespace std;
 
int bfs(int s, int e) {
    bool visit[100001= { false }; // 왔던 곳에 중복해서 가는 경우를 피하기 위해
    queue<pair<intint>> q; // 현재 위치, 걸린 시간
    q.push({ s,0 }); // 맨 처음의 위치, 시간을 큐에 넣음
 
    while (!q.empty()) {
        pair<intint> now = q.front(); // 현재위치 걸린 시간
        visit[now.first] = true// 방문 표시
        q.pop();
 
        if (now.first == e) // 도착한 경우 걸린 시간 리턴 후 종료
            return now.second;
        if (now.first-1 >= 0 && !visit[now.first - 1]) 
            q.push({ now.first - 1, now.second+1 }); // X서 X-1로 이동. 시간 1 증가
        if (now.first + 1 <= 100000 && !visit[now.first + 1]) 
            q.push({ now.first + 1, now.second+1 }); // X서 X+1로 이동. 시간 1 증가
        if (now.first * 2 <= 100000 && !visit[now.first * 2])
            q.push({ now.first * 2, now.second+1 }); // X서 X * 2로 이동. 시간 1 증가
    }
}
 
int main() {
    int start, end;
    cin >> start >> end;
    cout << bfs(start, end<< endl;
}
 
cs

2) pair 없이 bfs
while문 내에 for문을 둬 같은 시간일 때의 위치이동은 한번에 처리

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
#include <iostream>
#include <queue>
using namespace std;
 
int bfs(int s, int e) {
    bool visit[100001= { false }; // 왔던 곳에 중복해서 가는 경우를 피하기 위해
    queue<int> q; // 이동했던 위치를 담는 큐
    q.push(s); // 맨 처음의 위치를 큐에 넣음
    int time = 0// 맨 처음 시간
 
    while (!q.empty()) {
        int size = q.size();
        while(size--){
            int now = q.front(); // 현재위치
            visit[now] = true// 방문 표시
            q.pop();
 
            if (now == e) 
                return time; // 도착한 경우 걸린 시간 리턴 후 종료
            if (now-1 >= 0 && !visit[now - 1]) 
                q.push(now - 1); // X서 X-1로 이동.
            if (now + 1 <= 100000 && !visit[now + 1]) 
                q.push(now + 1); // X서 X+1로 이동. 시간 1 증가
            if (now * 2 <= 100000 && !visit[now * 2])
                q.push(now * 2); // X서 X * 2로 이동. 시간 1 증가
        }
        time++// 시간 증가
    }
}
 
int main() {
    int start, end;
    cin >> start >> end;
    cout << bfs(start, end<< endl;
}
cs

'알고리즘 > 백준' 카테고리의 다른 글

[C++/백트래킹] 백준 2580 스도쿠  (0) 2019.11.13
[C++/BFS] 백준 3184 양  (0) 2019.07.08
[C++/DP] 백준 1463 1로 만들기  (0) 2019.07.01
[C++/BFS] 백준 9019 DSLR  (0) 2019.03.31
[C++/BFS] 백준 2667 단지 번호 붙이기  (0) 2019.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함