반응형

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 |
댓글