1. 풀이방법.
- 3차원배열을 이용한 bfs로 해결하였습니다.
- 처음에 input을 받을 때 전체토마토 수, 익은토마토 수를 체크한 후
- bfs를 돌면서 익을 때 마다 익은토마토수를 ++ 해주며,
- 큐가 비었을 때(종료조건) -> 익은토마토수 == 전체토마토수 이면 걸린시간을 출력
-> 익은토마토수 != 전체토마토수 이면 (모두익힐 수 없음 -1출력)
2. 주의사항
- 3차원배열이므로 행,렬,높이 를 스스로 잘 설정하여 H,N,M 과 비교연산 등을 할 때 헷갈리지 않게 주의.
3. 나의코드
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
using namespace std;
int tomatobox[101][101][101];//높이,세로행,가로행
bool visit[101][101][101];
int N, M, H;
int totaltomato;
int dx[6] = { 1,-1,0,0,0,0 }; //6방향탐색
int dy[6] = { 0,0,1,-1,0,0 };
int dz[6] = { 0,0,0,0,1,-1 };
struct tomato {
int h, n, m;
};
queue<tomato> tmpq;
int timecount;
int tomatocount;
void inputs() {
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 >> tomatobox[i][j][k];
if (tomatobox[i][j][k] == 1) { //익은토마토
totaltomato++;
tomatocount++;
tomatobox[i][j][k] = true;
tmpq.push({ i,j,k });
}
if (tomatobox[i][j][k] == 0) { //익지않은 토마토
totaltomato++;
}
}
}
}
}
bool sidecheck(int x, int y, int z) { //경계선 체크
if (x >= 0 && x < H &&y >= 0 && y < N &&z >= 0 && z < M) return true;
else return false;
}
void bfs() {
while (1) {
int qsize = tmpq.size();
while (qsize--) {
tomato thistomato = tmpq.front();
tmpq.pop();
for (int i = 0; i < 6; i++) {
if (sidecheck(thistomato.h+dx[i], thistomato.n+dy[i], thistomato.m+dz[i])
&&tomatobox[thistomato.h + dx[i]][thistomato.n + dy[i]][thistomato.m + dz[i]]==0 && visit[thistomato.h + dx[i]][thistomato.n + dy[i]][thistomato.m + dz[i]] == false) {
visit[thistomato.h + dx[i]][thistomato.n + dy[i]][thistomato.m + dz[i]] = true;
tomatocount++; //토마토가 익음
tmpq.push({ thistomato.h + dx[i],thistomato.n + dy[i],thistomato.m + dz[i] });
}
}
}
if (tmpq.empty()) { //종료조건
if (totaltomato == tomatocount) {
cout << timecount << "\n";
return;
}
else {
cout << -1 << "\n";
return;
}
}
timecount++;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
inputs();
bfs();
return 0;
}
'알고리즘 문제풀이 > DFS와 BFS' 카테고리의 다른 글
백준 16236 [C++] (0) | 2020.12.29 |
---|---|
백준 2644 [C++] (0) | 2020.12.22 |
백준 1697 [C++] (0) | 2020.12.20 |
백준 16397 [C++] (0) | 2020.12.18 |
백준 6593 [C++] (0) | 2020.12.15 |