https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
풀이
bfs로 풀었다.
3차원 배열에 토마토를 저장해두고 큐가 비기 전까지 bfs를 수행한다.
x,y,z 좌표는 pair에 저장해주었다.
3차원 좌표하고 자료구조하고 매칭시키는것이 조금 헷갈렸다.
#include<iostream>
#include<queue>
using namespace std;
int box[100][100][100];
int M, N, H;//가로 , 세로, 높이
int ans;
int chk;
queue<pair<pair<int, int>, int>> q;
void bfs()
{
int dx[] = { 0,1,-1,0 ,0,0 };
int dy[] = { -1,0,0,1,0,0 };
int dh[] = { 0,0,0,0,1,-1 };
while (!q.empty())
{
int size = q.size();
ans++;
for (int i = 0; i < size; i++)
{
for (int t = 0; t < 6; t++)
{
int x = q.front().first.second + dx[t];
int y = q.front().first.first + dy[t];
int h = q.front().second + dh[t];
if (x >= 0 && x < M && y >= 0 && y < N && h >= 0 && h < H)
if (!box[h][y][x])
{
box[h][y][x] = 1;
q.push({ { y,x }, h });
}
}
q.pop();
}
}
//익지않은 토마토가 있는지 확인
for (int i = 0; i < H; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < M; k++)
{
if (!box[i][j][k])
{
cout << "-1";
return;
}
}
cout << ans - 1;
}
int main()
{
cin >> M >> N >> H;//가로 세로 높이
for (int i = 0; i < H; i++)
for (int j = 0; j < N; j++)
for (int k = 0; k < M; k++)//1은 익은 토마토, 0 은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않음
{
cin >> box[i][j][k];
if (!box[i][j][k])
chk++;
if (box[i][j][k] == 1)
q.push({ {j,k} ,i });
}
if (!chk) {
cout << 0;//다 익어 있음
return 0;
}
bfs();
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2179 비슷한 단어 c++ (0) | 2024.07.18 |
---|---|
[백준] 1987 알파벳 c++ (0) | 2023.04.16 |
[백준] 2137 c++ (0) | 2023.04.01 |
[백준] 11404 플로이드 C++ (0) | 2023.03.24 |
[백준] 1715 카드 정렬하기 c++ (1) | 2023.01.28 |