백준알고리즘

토마토

먼지의삶 2019. 8. 27. 22:19

 

예전에 풀었던 그냥 한판짜리 토마토가 기억이났는데, 비슷하지만 조금다르다.

차원이 하나가 더 늘어난 문제,

하지만 풀어보면서 느낀건 로직자체가 변화했거나 하진않았다는것이고,

이를통해서 충분히 BFS로 풀수있었다.

 

#include<cstdio>
#include<iostream>
#include<queue>
#include<utility>
#include<cstring>
#include<cstdlib>
#include<vector>

using namespace std;

struct tdi {
	int x, y, z;
};
int n, m, h;
int map[100][100][100];
int d[100][100][100];
bool dist[100][100][100];//필요한지 안필요한지 모르겠음 지금은

int dx[] = { 0,0,1,-1,0,0 };
int dy[] = { 1,-1,0,0,0,0 };
int dz[] = { 0,0,0,0,1,-1 };
int maxi = 10000000;
int maxim = 0;
vector<tdi> v;
bool no = false;

void bfs() {
	tdi three;

	queue<tdi> q;
	for (int i = 0; i < v.size(); i++) {
		q.push(v[i]);
	}
	maxim = 0;
	while (!q.empty()) {
		int x = q.front().x; int y = q.front().y; int z = q.front().z;
		q.pop();
		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 (map[nz][nx][ny] == 0 && d[nz][nx][ny] == 0) {
					map[nz][nx][ny] = 1;
					d[nz][nx][ny] = d[z][x][y] + 1;
					three.x = nx; three.y = ny; three.z = nz;
					maxim = d[nz][nx][ny] > maxim ? d[nz][nx][ny] : maxim;
					q.push(three);
				}
			}
		}
	}
	
}

bool check() {
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < m; j++) {
			for (int k = 0; k < n; k++) {
				if (map[i][j][k] == 0) {
					return false;
				}
			}
		}
	}
	return true;

}

int main() {
	scanf("%d %d %d", &n, &m, &h);
	for (int k = 0; k < h; k++) {
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &map[k][i][j]);
				if (map[k][i][j] == 1) {
					tdi t; t.x = i; t.y = j; t.z = k;
					v.push_back(t);
				}
			}
		}
	}
	bfs();
	if (check()) {
		cout << maxim<<endl;
	}
	else
		cout << -1;
	return 0;

}

 

그.. 막뭐 tie해서 묶는게있는거같은데 몰라서 그냥 구조체썼다.

주의 해야할건 안익은 토마토가 익는과정은 분명히 존재하지만, 익을수 없는 부분역시 존재하기때문에 고려해서 마지막에 체크한번 해주는것으로 문제가 끝난다.