백준 7576 토마토의 확장 문제 : http://deque.tistory.com/38
이런 날로 먹을수 있는 문제가 있었다면
7576을 풀때 pair를 안쓰고 2차원 배열을 쓰는건데...
약간 신경쓴 부분은
queue에 int 하나만 넣고 싶어서
K, I, J를 int 하나로 해싱했다.
#define INT_MAX_ 2147480000
#include
#include
#include
#include
using namespace std;
int M, N, H;
int day;
int max_day = 0;
int box[101][101][101];
int normalTomato[1000001][3];
int normalTomatoSize = 0;
int date[101][101][101];
int main() {
ifstream inFile("output.txt");
cin >> M >> N >> H;
int di[6] = {-1, 0, 1, 0, 0, 0};
int dj[6] = {0, +1, 0, -1, 0, 0};
int dk[6] = { 0, 0, 0, 0, -1, 1};
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
date[k][i][j] = INT_MAX_;
cin >> box[k][i][j];
if (box[k][i][j] == 1) {
normalTomato[normalTomatoSize][0] = k;
normalTomato[normalTomatoSize][1] = i;
normalTomato[normalTomatoSize][2] = j;
normalTomatoSize++;
date[k][i][j] = 0;
}
}
}
}
queue bfs;
for (int i = 0; i < normalTomatoSize; i++) {
//day = 0;
bfs.push(normalTomato[i][0]*1000000 + normalTomato[i][1]*1000 + normalTomato[i][2]);
bfs.push(-1);
while ( true ) {
int now_k = bfs.front() / 1000000;
int now_i = (bfs.front() - (now_k * 1000000)) / 1000;
int now_j = bfs.front() % 1000;
int now_date = date[now_k][now_i][now_j];
if (bfs.front() == -1) {
bfs.pop();
if (bfs.empty()) break;
bfs.push(-1);
continue;
}
for (int r = 0; r < 6; r++) {
int next_i = now_i + di[r];
int next_j = now_j + dj[r];
int next_k = now_k + dk[r];
int &next_date = date[next_k][next_i][next_j];
if (next_i >= 0 && next_i < N && next_j >= 0 && next_j < M && next_k >= 0 && next_k < H) {
if (box[next_k][next_i][next_j] == 0 || (now_date + 1 < next_date && box[next_k][next_i][next_j] == 1)) {
bfs.push(next_k * 1000000 + next_i * 1000 + next_j);
box[next_k][next_i][next_j] = 1;
next_date = now_date + 1;
}
}
}
bfs.pop();
}
}
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[k][i][j] == 0) {
cout << -1 << endl;
return 0;
}
if (date[k][i][j] >= max_day && box[k][i][j] == 1) {
max_day = date[k][i][j];
}
}
}
}
cout << max_day << endl;
return 0;
}
이 문제의 핵심은 이거다
....
'코딩 > 알고리즘' 카테고리의 다른 글
백준 2606 바이러스 (0) | 2018.01.01 |
---|---|
백준 2178 미로 (0) | 2018.01.01 |
백준 7576 토마토 (0) | 2018.01.01 |
백준 1967 트리의 지름 (0) | 2017.06.20 |
백준 2250 트리의 높이와 너비 (0) | 2017.06.18 |