BOJ 3055 :: 탈출
문제 링크 : https://www.acmicpc.net/problem/3055
물의 위치가 담겨있는 queue와 고슴도치의 위치가 담겨있는 queue 두 개를 이용하여 풀이한다.
고슴도치를 움직이기 전, 물을 먼저 채운 후, 고슴도치가 물이 아닌 위치를 이동하며 움직인다.
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_3055/BOJ_3055.cpp
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 | // 백준알고리즘 3055번 :: 탈출 #include<iostream> #include<queue> #include<string> using namespace std; int R, C; int ex, ey; int ans; bool flag; int dx[4] = { -1, 1, 0, 0 }; int dy[4] = { 0, 0, 1, -1 }; char map[51][51]; int visited[51][51]; queue<pair<int, int>> water; queue<pair<int, int>> pos; void bfs() { while (!pos.empty()) { int wsz = water.size(); // 물 채우기 while (wsz--) { int wx = water.front().first; int wy = water.front().second; water.pop(); for (int i = 0; i < 4; i++) { int wmx = wx + dx[i]; int wmy = wy + dy[i]; if (wmx < 0 || wmx >= R || wmy < 0 || wmy >= C) continue; if (map[wmx][wmy] == 'D' || map[wmx][wmy] == 'X' || map[wmx][wmy] == '*') continue; map[wmx][wmy] = '*'; water.push(make_pair(wmx, wmy)); } } int qsz = pos.size(); while (qsz--) { int x = pos.front().first; int y = pos.front().second; pos.pop(); if (x == ex && y == ey) flag = 1; if (flag) break; for (int i = 0; i < 4; i++) { int mx = x + dx[i]; int my = y + dy[i]; if (mx < 0 || mx >= R || my < 0 || my >= C) continue; if (map[mx][my] == '*' || map[mx][my] == 'X') continue; if (visited[mx][my]) continue; visited[mx][my] = 1; pos.push(make_pair(mx, my)); } } if (flag) break; ans++; } return; } int main(void) { string str; cin >> R >> C; for (int i = 0; i < R; i++) { cin >> str; for (int j = 0; j < C; j++) { map[i][j] = str[j]; if (map[i][j] == 'S') { visited[i][j] = 1; pos.push(make_pair(i, j)); } else if (map[i][j] == 'D') { ex = i; ey = j; } else if (map[i][j] == '*') { water.push(make_pair(i, j)); } } } bfs(); if (flag) cout << ans; else cout << "KAKTUS"; return 0; } | cs |
'Problem > BFS' 카테고리의 다른 글
[C/C++] BOJ 1938 :: 통나무 옮기기 (0) | 2019.02.17 |
---|---|
[C/C++] BOJ 1600 :: 말이 되고픈 원숭이 (0) | 2019.02.13 |
[C/C++] BOJ 1113 :: 수영장 만들기 (0) | 2019.02.08 |
[C/C++] BOJ 1726 :: 로봇 (0) | 2019.02.07 |
[C/C++] BOJ 10026 :: 적록색약 (0) | 2019.02.06 |