-
[백준/BOJ] 7569번 토마토 (C++)알고리즘 문제풀이/백준 2021. 1. 14. 19:31
BFS 유형의 문제입니다.
7576번 문제가 3차원으로 바뀐 문제입니다.
#include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; int m, n, h; int map[101][101][101]; int visit[101][101][101]; int dz[6] = {1, -1, 0, 0, 0, 0}; int dx[6] = {0, 0, 1, -1, 0, 0}; int dy[6] = {0, 0, 0, 0, 1, -1}; struct Info { int z, x, y; }; vector<Info> v; int BFS() { queue<Info> q; for(int i = 0; i < v.size(); i++) { q.push(v[i]); visit[v[i].z][v[i].x][v[i].y] = 0; } while(!q.empty()) { int z = q.front().z; int x = q.front().x; int y = q.front().y; q.pop(); for(int i = 0; i < 6; i++) { int nz = z + dz[i]; int nx = x + dx[i]; int ny = y + dy[i]; if(nz >= 0 && nz < h && nx >= 0 && nx < n && ny >= 0 && ny < m) { if(visit[nz][nx][ny] == -1 && map[nz][nx][ny] == 0) { q.push( {nz, nx, ny} ); visit[nz][nx][ny] = visit[z][x][y] + 1; } } } } int maxx = 0; for(int k = 0; k < h; k++) { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(map[k][i][j] == 0 && visit[k][i][j] == -1) return -1; maxx = max(maxx, visit[k][i][j]); } } } return maxx; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); cin >> m >> n >> h; for(int k = 0; k < h; k++) { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> map[k][i][j]; if(map[k][i][j] == 1) { v.push_back( {k, i, j} ); } } } } memset(visit, -1, sizeof(visit)); cout << BFS(); }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 11048번 이동하기 (C++) (0) 2021.01.18 [백준/BOJ] 16964번 DFS 스페셜 저지 (C++) (0) 2021.01.15 [백준/BOJ] 1012번 유기농 배추 (C++) (0) 2021.01.14 [백준/BOJ] 16940번 BFS 스페셜 저지 (0) 2021.01.14 [백준/BOJ] 4179번 불! (C++) (0) 2021.01.13