728x90
BFS문제입니다.
익은 토마토는 다음날 상, 하, 좌, 우, 위층, 아래층의 토마토를 익게합니다. (익지 않은 토마토 제외)
이 때 토마토가 전부 익는데 걸리는 최소날짜를 구해야합니다.
숫자가 1인 부분을 큐에 넣어놓고 빼면서 주변이 0인곳을 탐색하는 방식으로
BFS를 사용하여서 문제를 풀었습니다.
0인곳을 탐색하면 그 위치를 큐에 넣고 방문을 했다고 처리해줍니다.
큐가 비어있게 되면은 배열에 0이 있는지 확인하고 없으면
카운트한 횟수를 출력하고, 있으면 -1을 출력합니다.
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int map[110][110][110];
int moveX[4] = { 0, 1, 0, -1 };
int moveY[4] = { 1, 0, -1, 0 };
int moveZ[2] = { -1, 1 };
queue<vector<int> >q;
int main(int argc, char* argv[])
{
int n, m, h;
int a, b, c;
int count;
int x, y, z;
int flag = 0;
memset(map, -1, sizeof(map));
cin >> m >> n >> h;
for (int k = 1; k <= h; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> map[k][i][j];
if (map[k][i][j] == 1) {
vector<int> element;
element.push_back(k);
element.push_back(i);
element.push_back(j);
element.push_back(0);
q.push(element);
}
}
}
}
while (!q.empty()) {
a = q.front()[0];
b = q.front()[1];
c = q.front()[2];
count = q.front()[3];
q.pop();
for (int i = 0; i < 4; ++i) {
x = b + moveX[i];
y = c + moveY[i];
if (map[a][x][y] == 0) {
vector<int> element;
element.push_back(a);
element.push_back(x);
element.push_back(y);
element.push_back(count + 1);
q.push(element);
map[a][x][y] = 1;
}
}
for (int i = 0; i < 2; ++i) {
z = a + moveZ[i];
if (map[z][b][c] == 0) {
vector<int> element;
element.push_back(z);
element.push_back(b);
element.push_back(c);
element.push_back(count + 1);
q.push(element);
map[z][b][c] = 1;
}
}
}
for (int k = 1; k <= h; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (map[k][i][j] == 0) {
flag = 1;
}
}
}
}
if (flag) {
cout << "-1" << endl;
}
else {
cout << count << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 15649번 N과 M (1) (0) | 2019.09.11 |
---|---|
[C++] 백준 2206번 벽 부수고 이동하기 (0) | 2019.09.11 |
[C++] 백준 7576번 토마토 (0) | 2019.09.11 |
[C++] 백준 2178번 미로 탐색 (0) | 2019.09.10 |
[C++] 백준 2606번 바이러스 (0) | 2019.09.10 |