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
관리 메뉴

혼종 꼬지마루

[백준] 1938 - 통나무 옮기기 본문

Algorithms/BFS

[백준] 1938 - 통나무 옮기기

꼬지마루 2018. 8. 30. 17:57

그냥 문제에 조건에 맞게 BFS만 잘 구현해주면 될 것 같았던 문제


하지만 visit을 체크하는 과정에서 통나무의 방향을 따로 체크해줘야 하기 때문에 3차원 check배열이 필요했다


그 외에는 문제의 조건에 맞게만 구현해주고, 3개를 한꺼번에 움직이는 것이 귀찮을 뿐 그냥 저냥 할만했던 문제


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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <queue>
#define MX 55
using namespace std;
 
struct WOOD {
    int x, y;
};
 
struct TOTAL {
    WOOD a, b, c;
    int dir;
}wood, iwood, nwood;
 
queue <TOTAL> q;
char map[MX][MX];
int check[2][MX][MX];
int N, cnt, sw;
 
void bfs()
{
    check[q.front().dir][q.front().b.y][q.front().b.x] = 1;
    while (!q.empty())
    {
        iwood = q.front();
        if (map[iwood.a.y][iwood.a.x] == 'E' && map[iwood.b.y][iwood.b.x] == 'E' && map[iwood.c.y][iwood.c.x] == 'E') {
            sw = 1return;
        }
        q.pop();
        for (int i = 1; i <= 5; i++)
        {
            if (i == 1)
            {
                if (iwood.a.y == 0continue;
                if (map[iwood.a.y - 1][iwood.a.x] == '1' || map[iwood.b.y - 1][iwood.b.x] == '1' || map[iwood.c.y - 1][iwood.c.x] == '1'continue;
                nwood.a.x = iwood.a.x; nwood.a.y = iwood.a.y - 1;
                nwood.b.x = iwood.b.x; nwood.b.y = iwood.b.y - 1;
                nwood.c.x = iwood.c.x; nwood.c.y = iwood.c.y - 1;
                nwood.dir = iwood.dir;
            }
            else if (i == 2)
            {
                if (iwood.c.y == N - 1continue;
                if (map[iwood.a.y + 1][iwood.a.x] == '1' || map[iwood.b.y + 1][iwood.b.x] == '1' || map[iwood.c.y + 1][iwood.c.x] == '1'continue;
                nwood.a.x = iwood.a.x; nwood.a.y = iwood.a.y + 1;
                nwood.b.x = iwood.b.x; nwood.b.y = iwood.b.y + 1;
                nwood.c.x = iwood.c.x; nwood.c.y = iwood.c.y + 1;
                nwood.dir = iwood.dir;
            }
            else if (i == 3)
            {
                if (iwood.a.x == 0continue;
                if (map[iwood.a.y][iwood.a.x - 1== '1' || map[iwood.b.y][iwood.b.x - 1== '1' || map[iwood.c.y][iwood.c.x - 1== '1'continue;
                nwood.a.x = iwood.a.x - 1; nwood.a.y = iwood.a.y;
                nwood.b.x = iwood.b.x - 1; nwood.b.y = iwood.b.y;
                nwood.c.x = iwood.c.x - 1; nwood.c.y = iwood.c.y;
                nwood.dir = iwood.dir;
            }
            else if (i == 4)
            {
                if (iwood.c.x == N - 1continue;
                if (map[iwood.a.y][iwood.a.x + 1== '1' || map[iwood.b.y][iwood.b.x + 1== '1' || map[iwood.c.y][iwood.c.x + 1== '1'continue;
                nwood.a.x = iwood.a.x + 1; nwood.a.y = iwood.a.y;
                nwood.b.x = iwood.b.x + 1; nwood.b.y = iwood.b.y;
                nwood.c.x = iwood.c.x + 1; nwood.c.y = iwood.c.y;
                nwood.dir = iwood.dir;
            }
            else if (i == 5)
            {
                if (iwood.dir)
                {
                    if (map[iwood.a.y - 1][iwood.a.x] == '1' || map[iwood.a.y + 1][iwood.a.x] == '1'continue;
                    if (map[iwood.b.y - 1][iwood.b.x] == '1' || map[iwood.b.y + 1][iwood.b.x] == '1'continue;
                    if (map[iwood.c.y - 1][iwood.c.x] == '1' || map[iwood.c.y + 1][iwood.c.x] == '1'continue;
                    if (iwood.b.y == || iwood.b.y == N - 1continue;
                    nwood.a.x = iwood.a.x + 1; nwood.a.y = iwood.a.y - 1;
                    nwood.b.x = iwood.b.x; nwood.b.y = iwood.b.y;
                    nwood.c.x = iwood.c.x - 1; nwood.c.y = iwood.c.y + 1;
                    nwood.dir = 0;
                }
                else
                {
                    if (map[iwood.a.y][iwood.a.x - 1== '1' || map[iwood.a.y][iwood.a.x + 1== '1'continue;
                    if (map[iwood.b.y][iwood.b.x - 1== '1' || map[iwood.b.y][iwood.b.x + 1== '1'continue;
                    if (map[iwood.c.y][iwood.c.x - 1== '1' || map[iwood.c.y][iwood.c.x + 1== '1'continue;
                    if (iwood.b.x == || iwood.b.x == N - 1continue;
                    nwood.a.x = iwood.a.x - 1; nwood.a.y = iwood.a.y + 1;
                    nwood.b.x = iwood.b.x; nwood.b.y = iwood.b.y;
                    nwood.c.x = iwood.c.x + 1; nwood.c.y = iwood.c.y - 1;
                    nwood.dir = 1;
                }
            }
            if (check[nwood.dir][nwood.b.y][nwood.b.x]) continue;
            q.push(nwood);
            check[nwood.dir][nwood.b.y][nwood.b.x] = check[iwood.dir][iwood.b.y][iwood.b.x] + 1;
        }
    }
}
 
int main(void)
{
    cin >> N;
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            char c;
            cin >> c;
            map[i][j] = c;
            if (!cnt&&== 'B') { wood.a.x = j; wood.a.y = i; cnt++; }
            else if (cnt == && c == 'B') { wood.b.x = j; wood.b.y = i; cnt++; }
            else if (cnt == && c == 'B'
            {
                wood.c.x = j; wood.c.y = i;
                if (wood.a.x == wood.b.x && wood.b.x == wood.c.x) wood.dir = 0;
                else wood.dir = 1;
                q.push(wood);
            }
        }
    }
 
    bfs();
 
    if(sw) cout << check[iwood.dir][iwood.b.y][iwood.b.x] - << endl;
    else cout << << endl;
    return 0;
}
cs

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

[SWEA] 5521 - 상원이의 생일파티  (0) 2018.09.07
[SWEA] 1267 - 작업순서  (0) 2018.09.03
[백준] 5022 - 연결  (0) 2018.08.30
[백준] 9328 - 열쇠  (0) 2018.08.30
[백준] 5213 - 과외맨  (0) 2018.08.30