프로그래밍 알고리즘

[정올 1840] 치즈

꾸준한사람 2023. 1. 6. 03:16
반응형

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

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

//녹을 치즈는 2번으로, 빈 공간은 3번부터 순차 증가
int cheese[105][105], R, C, meltedCheese, hour;
enum {
	EMPTY = 0,
	CHEESE, //1
	MELT,   //2
	CHECKED //3
};
struct P {
	int r, c;
} que[50000];
int s, e, dr[4] = { 0, 0, 1,-1 }, dc[4] = { 1, -1, 0, 0 };
void enque(int r, int c) {
	que[e].r = r, que[e++].c = c;
	cheese[r][c] = CHECKED;
}
P deque() {	return que[s++];	}
int Melt() {
	meltedCheese = 0;
	int restCheese = 0;
	hour++;
	for (int r = 0; r < R; r++)
		for (int c = 0; c < C; c++) {
			switch (cheese[r][c]) {
			case CHEESE:	restCheese++;				break;
			case MELT:		cheese[r][c] = EMPTY;		meltedCheese++;			break;
			case CHECKED:	cheese[r][c] = EMPTY;		break;
			}
		}
	return restCheese;
}
//상하좌우 이동한 값이, 경계 1이면 -> 2로 체크, 
int check(int r, int c, int nexttime) {
	if (r < 0 || c < 0 || r >= R || c >= C) return -1;
	return cheese[r][c];
}
void BFS() {
	int newhour = hour + 1, checkval, newr, newc;
	s = e = 0;
	P curP;
	enque(0, 0);
	while (s <= e) {
		curP = deque();
		for (int i = 0; i < 4; i++) {
			newr = curP.r + dr[i], newc = curP.c + dc[i];
			switch (check(newr, newc, newhour)) {
			case EMPTY:		enque(newr, newc);		break;
			case CHEESE:	cheese[newr][newc] = MELT;		break;
			}
		}
	}
}

int main(void) {
	scanf("%d%d", &R, &C);

	for (int r = 0; r < R; r++)
		for (int c = 0; c < C; c++) { 
			scanf("%d", &cheese[r][c]); 
			if (cheese[r][c] == 0) cheese[r][c] = 3;
		}
	while (Melt()) {
		BFS();
	}
	
	printf("%d\n%d\n", hour - 1, meltedCheese);

	return 0;
}
반응형

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

[정올 1901] 소수 구하기  (0) 2023.01.06
[정올 1885] 접두사  (1) 2023.01.06
[정올 1836] 연속부분합 찾기  (0) 2023.01.06
[정올 1828] 냉장고  (1) 2023.01.06
[정올 1809] 탑  (0) 2023.01.06