728x90
728x90
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
난이도: solved.ac 골드 5
box라는 3차원 배열을 만들고, 해당 배열에 입력을 받았다.
그리고 먼저 box[i][j][k] = 1인 곳을 큐에 담고, 큐에서 하나씩 꺼내 주위 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 중 0인 곳은 값을 1씩 증가시켜 저장하였다.
0일차를 1로 시작했으므로 box[i][j][k]가 가장 큰 곳에서 1을 뺀 값을 출력하도록 해주었다.
그리고 -1로 둘러 쌓여 익지 못한 곳 (0)인 곳이 있으면 -1을 출력하도록 해주었다.
#include <bits/stdc++.h> using namespace std; int box[100][100][100]; typedef pair<int, pair<int, int>> cor; queue<cor> q; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, M, H, i, j, k; cin >> M >> N >> H; for (i = 0; i < H; i++) for (j = 0; j < N; j++) for (k = 0; k < M; k++) { cin >> box[i][j][k]; if (box[i][j][k] == 1) q.push(make_pair(i, make_pair(j, k))); } int dx[6] = { 1,0,-1,0,0,0 }; int dy[6] = { 0,1,0,-1,0,0 }; int dz[6] = { 0,0,0,0,1,-1 }; while (!q.empty()) { cor qfront = q.front(); q.pop(); int curz = qfront.first; int cury = qfront.second.first; int curx = qfront.second.second; int order = box[curz][cury][curx]; for (int dir = 0; dir < 6; dir++) { int nz = curz + dz[dir]; int ny = cury + dy[dir]; int nx = curx + dx[dir]; if (nz >= 0 && nz < H && ny >= 0 && ny < N && nx >= 0 && nx < M) { if (!box[nz][ny][nx]) { q.push(make_pair(nz, make_pair(ny, nx))); box[nz][ny][nx] = order + 1; } } } } int max = 0; for (i = 0; i < H; i++) for (j = 0; j < N; j++) for (k = 0; k < M; k++) { if (box[i][j][k]) { if (box[i][j][k] > max) max = box[i][j][k]; } else { cout << "-1"; return 0; } } cout << max - 1; }

반응형