반응형

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

 

2479번: 경로 찾기

길이가 같은 두 개의 이진수 코드 A와 B가 있다고 하자. 이 두 코드 사이의 해밍 거리는 A와 B의 각 비트를 왼쪽부터 오른쪽으로 차례대로 비교할 때 서로 다른 값을 가진 비트의 수이다. 예를 들

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 각각의 코드를 입력받아 str 배열에 저장합니다.

 

2. 각각의 코드들을 서로 비교하면서 다른 자릿수가 1개만 존재하는 쌍들로 list 배열을 만들어 저장합니다.

 

3. bfs를 이용하여 A부터 B까지 경로가 존재하면 경로를 저장해 해당 경로를 출력하고, 그렇지 않으면 -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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<iostream>
#include<queue>
#include<vector>
#include<string>
 
using namespace std;
 
int N, K;
vector<int> list[1001];
int visited[1001];
string str[1001];
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> N >> K;
 
    for (int i = 1; i <= N; i++) {
        cin >> str[i];
    }
 
    for (int i = 1; i < N; i++) {
        for (int j = i + 1; j <= N; j++) {
            int cnt = 0;
            for (int k = 0; k < K; k++) {
                if (str[i][k] != str[j][k]) {
                    cnt++;
                }
                if (cnt > 1break;
            }
            if (cnt == 1) {
                list[i].push_back(j);
                list[j].push_back(i);
            }
        }
    }
 
    queue<pair<intvector<int>>>q;
 
    int A, B;
    cin >> A >> B;
 
    q.push({ A,{} });
    visited[A] = 1;
 
    while (!q.empty()) {
        const int cur = q.front().first;
        vector<int> route = q.front().second;
        q.pop();
 
        route.push_back(cur);
 
        if (cur == B) {
            for (auto& next : route) {
                cout << next << ' ';
            }
            return 0;
        }
 
        for (auto& next : list[cur]) {
            if (visited[next] != 1) {
                visited[next] = 1;
                q.push({ next,route });
            }
        }
    }
 
    cout << -1;
}
cs
반응형

+ Recent posts