반응형
백준 7576번 : 토마토의 3차원 버전인 문제이다.
3차원 배열을 처음 써봐서 조금 헷갈렸지만 그래도 금방 풀었다!
여러가지 C++에 내장된 함수들을 써보는듯.
다른 글들을 보니 pair<pair<int, int>, int>이런 방법도 쓴 사람도 있었다.
#include<iostream>
#include<queue>
#include<tuple>
using namespace std;
#define MAX 100
int map[MAX][MAX][MAX];
bool visit[MAX][MAX][MAX];
int dx[6] = {1, -1, 0, 0, 0, 0};
int dy[6] = {0, 0, 1, -1, 0, 0};
int dz[6] = {0, 0, 0, 0, 1, -1};
int M, N, H;
int result = 0;
queue<tuple<int, int, int>> q;
void bfs() {
int x, y, z;
while(!q.empty()) {
tie(z, y, x) = q.front();
q.pop();
visit[z][y][x] = true;
for(int i = 0; i < 6; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
int nz = z + dz[i];
if(nx >= 0 && nx < M && ny >= 0 && ny < N && nz >= 0 && nz < H) {
if(visit[nz][ny][nx] == false && map[nz][ny][nx] == 0) {
q.push(make_tuple(nz, ny, nx));
visit[nz][ny][nx] = true;
map[nz][ny][nx] = map[z][y][x] + 1;
result = map[nz][ny][nx];
}
}
}
}
}
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++) {
cin >> map[i][j][k];
if(map[i][j][k] == 1) {
q.push(make_tuple(i, j, k));
}
}
}
}
bfs();
for(int i = 0; i < H; i++) {
for(int j = 0; j < N; j++) {
for(int k = 0; k < M; k++) {
if(map[i][j][k] == 0) {
result = -1;
}
}
}
}
if(result > 0) {
cout << result - 1 << endl;
} else {
cout << result << endl;
}
return 0;
}
반응형
'BaekJoon > C++' 카테고리의 다른 글
1010 : 다리 놓기 (C++) (0) | 2021.02.09 |
---|---|
2206 : 벽 부수고 이동하기 (C++) (0) | 2021.02.09 |
1697 : 숨바꼭질 (C++) (0) | 2021.02.08 |
1926 : 그림 (C++) (0) | 2021.02.08 |
2576 : 홀수 (C++) (0) | 2021.02.05 |
댓글