728x90

 0. [c++] 백준


https://www.acmicpc.net/problem/13913


 1. 풀이



 2. 소스코드


- 1차 코드(경로 전체를 저장, 시간초과가 발생하였다.)

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
50
51
52
53
54
55
56
57
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
 
using namespace std;
 
int N, K;
bool visited[200001];
 
void solve() {
    queue<vector<int> > qu;
    qu.push(vector<int>(1, N));
 
    while (!qu.empty()) {
        vector<int> here = qu.front();
        int here_num = here.back();
        qu.pop();
        if (here_num == K) {
            cout << here.size() - 1 << endl;
            for (int i = 0; i < here.size(); i++)
                cout << here[i] << " ";
            return;
        }
        
        if (here_num * 2 <= K * 2 && !visited[here_num * 2]) {
            here.push_back(here_num * 2);
            qu.push(here);
            here.pop_back();
            visited[here_num * 2= true;
        }
        
        if (here_num + 1 <= K && !visited[here_num + 1]) {
            here.push_back(here_num + 1);
            qu.push(here);
            here.pop_back();
            visited[here_num + 1= true;
        }
 
        if (here_num > 0 && !visited[here_num - 1]) {
            here.push_back(here_num - 1);
            qu.push(here);
            here.pop_back();
            visited[here_num - 1= true;
        }
    }
}
 
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> N >> K;
 
    solve();
}
cs



- 2차 코드(경로를 int 배열에 저장)

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
 
using namespace std;
 
int N, K;
bool visited[200001];
int path[200001];
 
void solve() {
    queue<pair<intint> > qu;
    qu.push({ N,0 });
 
    while (!qu.empty()) {
        pair<intint> here = qu.front();
        qu.pop();
 
        if (here.first == K) {
            cout << here.second << endl;
            vector<int> ans;
            int count = here.second;
            int next = K;
            ans.push_back(K);
            while (count--) {
                ans.push_back(path[next]);
                next = path[next];
            }
            reverse(ans.begin(), ans.end());
 
            for (int i = 0; i < ans.size(); i++) {
                cout << ans[i] << " ";
            }
            return;
        }
        
        if (here.first * 2 <= K * 2 && !visited[here.first * 2]) {
            qu.push({ here.first * 2, here.second + 1 });
            visited[here.first * 2= true;
            path[here.first * 2= here.first;
        }
        
        if (here.first + 1 <= K && !visited[here.first + 1]) {
            qu.push({ here.first + 1, here.second + 1 });
            visited[here.first + 1= true;
            path[here.first + 1= here.first;
        }
 
        if (here.first > 0 && !visited[here.first - 1]) {
            qu.push({ here.first - 1, here.second + 1 });
            visited[here.first - 1= true;
            path[here.first - 1= here.first;
        }
    }
}
 
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> N >> K;
 
    solve();
}
cs


 3. 참고




질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts