본문 바로가기
BaekJoon/C++

7569 : 토마토 (C++)

by GrayChoi 2021. 2. 8.
반응형

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net


백준 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

댓글