펭로그

[C++] 삼성 SDS KOITP 보물찾기 본문

Study/PS(Algorithm)

[C++] 삼성 SDS KOITP 보물찾기

노랑펭귄 2018. 7. 21. 11:59

문제링크 : https://koitp.org/problem/SDS_TEST_TREASURE


[삼성 SDS 대학생 알고리즘 특강 사전 테스트 B Type 1번 문제]

DFS로 풀게되면 무조건 시간초과가 나게되서 BFS로 풀어야하는 문제이다.

최단거리를 찾는 동시에 이동한 거리를 dist 배열을 따로 만들어서 별도로 저장했다.



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
// KOITP_SDS_Btype_01
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    // freopen("../input.txt", "r", stdin);
    int T;
    cin >> T;
    for (int t = 1; t <= T; t++) {
        int ruin, numOfClue, remain, result;
        cin >> ruin >> numOfClue >> remain;
        vector<vector<bool>>clue(ruin + 1, vector<bool>(ruin + 1false));
        vector<bool>visited(ruin + 1false);
        vector<int> queue;
        vector<int> dist(ruin+1);
        int input1, input2;
        for (int i = 0; i < numOfClue; i++) {
            cin >> input1 >> input2;
            clue[input1][input2] = true;
        }
        visited[1= true;
        dist[1= 0;
        queue.push_back(1);
 
        while(!queue.empty()){
            int cur = queue.front();
            queue.erase(queue.begin());
            for(int i = 1; i <= ruin; i++){
                if(clue[cur][i] && !visited[i]){
                    visited[i] = true;
                    dist[i] = dist[cur] + 1;
                    queue.push_back(i);
 
                    if(i == ruin)
                        goto OUT;
                }
            }
        }
        OUT:
        result = dist[ruin] == 0 || dist[ruin] > remain? -1 : dist[ruin];
 
        cout << "#" << t << " " << result << "\n";
    }
    return 0;
}
 
cs



Comments