Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[백준] 5213 - 과외맨 본문

Algorithms/BFS

[백준] 5213 - 과외맨

꼬지마루 2018. 8. 30. 12:20

BFS + 그래프를 이용하여 해결 가능


다시 풀기 싫은 문제...


다른방법이 있을지는 모르겠지만 개인적으로는 stl을 사용하여 Queue를 사용하면 못풀 것 같다는 생각이 드는 문제


배열을 2칸을 묶어서 1칸으로 쓰는 것도 중요하다


1. 입력을 받고, 배열 2칸을 1칸으로 만들어 문제와 똑같은 형태로 각 칸에 번호를 매긴다


2. 각 정점에서 문제 조건에 맞는 갈 수 있는 방향을 그래프로 만들어 준다.


3. 이 그래프를 시작으로 BFS탐색 시작!


4. 문제의 조건 중 '도착할 수 없다면 가장 큰 위치로 이동한다'이 조건을 위해 번호가 크다면 계속 갱신을 시켜주고,


이 경로를 추적하기 위해 큐에 들어가는 정보 중 이전 큐의 위치, 즉 탐색을 하는 위치의 큐넘버를 함께 담아준다


5. 문제의 조건에 맞게 출력!


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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream>
#define MX 510
using namespace std;
 
struct kkk{
    int r, br, n;
}q[MX * 2*MX];
 
int map[MX][* MX], mapnum[MX][* MX], check[MX * MX], graph[MX * MX][7], dab[MX*MX];
int dx[] = { 00-1};
int dy[] = { -110};
int N, st, ed, ir, point, pointpos, cnt, sw;
 
void bfs()
{
    st = ed = -1;
    q[++st].r = 1; q[st].br = -1; q[st].n = 1; check[1= 1;
    while (st != ed)
    {
        ir = q[++ed].r;
        for (int i = 0; i < 6; i++)
        {
            if (check[graph[ir][i]]) continue;
            if (!graph[ir][i]) break;
            q[++st].r = graph[ir][i]; q[st].br = ed; q[st].n = q[ed].n + 1; check[graph[ir][i]] = 1;
            if (point < graph[ir][i])
            {
                point = graph[ir][i]; pointpos = st;
            }
            if (q[st].r == cnt) { sw = 1break; }
        }
        if (sw) break;
    }
}
 
void way()
{
    int next = -1, pos = 0;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= * N; j++)
        {
            if (!map[i][j]) continue;
            if (pos != mapnum[i][j]) next = -1;
            for (int k = 0; k < 4; k++)
            {
                int nx = j + dx[k];
                int ny = i + dy[k];
                if (nx < || ny < || nx > * N || ny > N) continue;
                if (mapnum[ny][nx] == mapnum[i][j]) continue;
                if (map[ny][nx] != map[i][j]) continue;
                graph[mapnum[i][j]][++next] = mapnum[ny][nx];
            }
            pos = mapnum[i][j];
        }
    }
}
 
void find(int n)
{
    int k = -1;
    while (n >= 0)
    {
        dab[++k] = q[n].r;
        n = q[n].br;
    }
}
 
int main(void)
{
    cin >> N;
 
    for (int i = 1; i <= N; i++)
    {
        if (i % 2)
        {
            for (int j = 1; j <= * N; j += 2)
            {
                cin >> map[i][j] >> map[i][j + 1];
                mapnum[i][j] = ++cnt; mapnum[i][j + 1= cnt;
            }
        }
        else
        {
            for (int j = 2; j <= * (N - 1); j += 2)
            {
                cin >> map[i][j] >> map[i][j + 1];
                mapnum[i][j] = ++cnt; mapnum[i][j + 1= cnt;
            }
        }
    }
    way();
    bfs();
    if (sw)
    {
        int k = q[st].n;
        cout << k << endl;
        find(st);
        for (int i = k - 1; i >= 0; i--)
            cout << dab[i] << " ";
        cout << endl;
    }
    else
    {
        int k = q[pointpos].n;
        cout << k << endl;
        find(pointpos);
        for (int i = k - 1; i >= 0; i--)
            cout << dab[i] << " ";
        cout << endl;
    }
    return 0;
}
cs

'Algorithms > BFS' 카테고리의 다른 글

[백준] 1938 - 통나무 옮기기  (0) 2018.08.30
[백준] 5022 - 연결  (0) 2018.08.30
[백준] 9328 - 열쇠  (0) 2018.08.30
[백준] 1261 - 알고스팟  (0) 2018.08.30
[백준] 1967 - 트리의 지름  (0) 2018.08.27