프로그래밍 알고리즘

[정올 2613] 토마토(고)

꾸준한사람 2023. 1. 9. 03:42
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1875&sca=99&sfl=wr_hit&stx=2613 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

int tomato[1010][1010], R, C, s, e, days, dr[4] = { 0,0,1,-1 }, dc[4] = { 1, -1, 0, 0 };
struct P {
	int r, c, day;
} que[2000000];
void enque(int r, int c, int day) {
	que[e].r = r, que[e].c = c, que[e++].day = day;
	tomato[r][c] = day + 1;
}
P deque() {	return que[s++];	}
bool check(int r, int c) { //안 익은 토마토인지 확인
	if (r < 0 || c < 0 || r >= R || c >= C) return false;
	if (tomato[r][c] == 0) return true;
	else return false;
}
void BFS() {
	P cur;
	int newr, newc;
	while (s <= e) {
		cur = deque();
		for (int i = 0; i < 4; i++) {
			newr = cur.r + dr[i], newc = cur.c + dc[i];
			if (check(newr, newc)) {
				enque(newr, newc, cur.day + 1);
				if (days < cur.day + 1) days = cur.day + 1;
			}
		}
	}
}

int main(void) {
	scanf("%d%d", &C, &R);
	bool unmatured = false;
	for (int r = 0; r < R; r++)
		for (int c = 0; c < C; c++) { 
			scanf("%d", &tomato[r][c]); 
			if (tomato[r][c] == 1) enque(r, c, 0);
		}
	BFS();
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			if (tomato[r][c] == 0) {
				unmatured = true;
				break;
			}
		}
		if (unmatured) break;
	}

	printf("%d\n", unmatured ? -1 : days);
	return 0;
}
반응형

'프로그래밍 알고리즘' 카테고리의 다른 글

[정올 2811] 소수와 합성수  (0) 2023.01.09
[정올 2809] 약수  (0) 2023.01.09
[정올 2543] 타일 채우기  (1) 2023.01.09
[정올 2518] 문자열변환  (0) 2023.01.09
[정올 2514] 문자열 찾기  (0) 2023.01.09