혼종 꼬지마루
[백준] 1938 - 통나무 옮기기 본문
그냥 문제에 조건에 맞게 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 = 1; return; } q.pop(); for (int i = 1; i <= 5; i++) { if (i == 1) { if (iwood.a.y == 0) continue; 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 - 1) continue; 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 == 0) continue; 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 - 1) continue; 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 == 0 || iwood.b.y == N - 1) continue; 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 == 0 || iwood.b.x == N - 1) continue; 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&&c == 'B') { wood.a.x = j; wood.a.y = i; cnt++; } else if (cnt == 1 && c == 'B') { wood.b.x = j; wood.b.y = i; cnt++; } else if (cnt == 2 && 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] - 1 << endl; else cout << 0 << 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 |