컴퓨터기본/문제풀이

[백준] 7569번: 토마토

차가운오미자 2021. 11. 18. 20:14

https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

문제이해

https://chagaun-omija.tistory.com/74

 

[백준] 7576번: 토마토

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다...

chagaun-omija.tistory.com

여기 있는 토마토 문제랑 거의 똑같은데, 토마토 상자들이 3차원이 되었다는 점이 다르다. 

고로 BFS를 하되, 방향을 4방향이 아닌 상하좌우 + 위, 아래 를 해줘야 한다.

그거 외엔 어려운 점 없음!

 

작성 코드 (C)

#include <stdio.h>
#define MAXN 100

int M, N, H;
int map[MAXN + 5][MAXN + 5][MAXN + 5];
int visited[MAXN + 5][MAXN + 5][MAXN + 5];
int tomato;
typedef struct ele {
	int h, y, x, t;
}ELE;
ELE q[MAXN * MAXN * MAXN * 10];
int wp, rp;
void enq(int h, int y, int x, int t) {
	q[wp].h = h;
	q[wp].y = y;
	q[wp].x = x;
	q[wp++].t = t;
}
ELE deq(void) {return q[rp++];}
int empty(void) { return wp == rp; }

int dh[] = { 0, 0, 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0, 0, 0 };
int dx[] = { 0, 0, -1, 1, 0, 0 };

void Get_Input(void) {
	scanf("%d %d %d", &M, &N, &H);
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < M; k++) {
				scanf("%d ", &map[i][j][k]);
				if (map[i][j][k] == 0) tomato++;
			}
		}
	}
}

int BFS(void) {
	int cnt = 0; 
	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] == 1) {
					enq(i, j, k, 0);
					//visited[i][j][k] = 1;
				}
			}
		}
	}

	while (!empty()) {
		ELE cur = deq();
		for (int i = 0; i < 6; i++) {
			int nh = dh[i] + cur.h;
			int ny = dy[i] + cur.y;
			int nx = dx[i] + cur.x;
			if (nh < 0 || nh >= H || ny < 0 || ny >= N || nx < 0 || nx >= M) continue;
			if (map[nh][ny][nx] != 0) continue;
			// 익지 않은 토마토
			map[nh][ny][nx] = cur.t + 1;
			enq(nh, ny, nx, cur.t + 1);
			cnt++;
		}
	}
	return cnt;
}

int main(void) {
	freopen("in.txt", "r", stdin);
	Get_Input();
	int cnt = BFS();
	if (cnt < tomato) printf("-1");
	else printf("%d", q[wp - 1].t);
	return 0;
}

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

[백준] 16985번: Maaaaaaaaaze  (0) 2021.11.18
[백준] 11003번: 최솟값 찾기  (0) 2021.11.18
[백준] 2933번: 미네랄  (0) 2021.11.18
[백준] 1260번: DFS와 BFS  (0) 2021.11.18
[백준] 13458번: 시험 감독  (0) 2021.11.18