[BakJoon] 백준 7569번 토마토
문제: https://www.acmicpc.net/problem/7569
내코드
- 처음에는 큐에 queue<int[4]> 이렇게 하려고 했으나 stl에는 배열이 들어가지 않는다고 해서 dist는 배열을 따로 만들어주었다.
- 7576번 토마토와 비슷하지만 높이가 추가 되서 인접한 토마토만 추가해주고 높이만 따로 생각해주면 된다.
- 아래는 아이패드에 정리한 내용
#include <iostream>
#include <string>
#include <queue>
#include <utility>
using namespace std;
int h, m, n, maxN = 0;
int x, y, z;
int arr[100][100][100];
int dist[100][100][100];
bool visited[100][100][100];
queue<pair<pair<int, int>, int>> qu;
pair<pair<int, int>, int> cur;
void isNear(int c, int a, int b) {
if (a < 0 || b < 0 || c < 0 || a >= n || b >= m || c >= h) return;
if (arr[c][a][b] == 0 && visited[c][a][b] == false) {
qu.push(make_pair(make_pair(c, a), b));
dist[c][a][b] = dist[z][x][y] + 1;
visited[c][a][b] = true;
maxN = (maxN < dist[c][a][b]) ? dist[c][a][b] : maxN;
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> m >> n >> h;
for (int k = 0; k < h; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[k][i][j];
}
}
}
for (int k = 0; k < h; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[k][i][j] == 1) {
qu.push(make_pair(make_pair(k, i), j));
visited[k][i][j] = true;
dist[k][i][j] = 0;
}
}
}
}
if (qu.empty()) {
cout << 0;
return 0;
}
while (!qu.empty()) {
cur = qu.front();
x = cur.first.second;
y = cur.second;
z = cur.first.first;
qu.pop();
isNear(z + 1, x, y);
isNear(z - 1, x, y);
isNear(z, x, y-1);
isNear(z, x, y + 1);
isNear(z, x + 1, y);
isNear(z, x - 1, y);
}
for (int k = 0; k < h; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[k][i][j] != -1 && visited[k][i][j] == false) {
cout << -1;
return 0;
}
}
}
}
cout << maxN;
return 0;
}
참고
728x90
반응형
'CS > Algorithm 문제' 카테고리의 다른 글
[BaekJoon] 백준 11724번 연결 요소의 개수 (0) | 2020.03.11 |
---|---|
[BaekJoon] 백준 2667번 단지번호 붙이기 (0) | 2020.03.10 |
[BaekJoon] 백준 7576번 토마토 (0) | 2020.03.08 |
[BaekJoon] 백준 1697번 숨바꼭질 (0) | 2020.02.28 |
[BaekJoon] 백준 2178번 미로탐색 (0) | 2020.02.25 |