프로그래밍 알고리즘

[정올 1078] 저글링 방사능 오염

꾸준한사람 2022. 12. 14. 23:13
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=358&sca=99 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

int grid[105][105], R, C, SR, SC, s, e;
int dr[4] = { 1, -1, 0,  0 };
int dc[4] = { 0,  0, 1, -1 };
struct P { //BFS를 위한 Queue
	int r, c, cnt;
} Que[50000];

void enq(int r, int c, int cnt) {
	//방사능 오염된 저글링은 죽는 시간을 cnt로 표시함
	Que[e].r = r;	Que[e].c = c;	Que[e++].cnt = cnt;	grid[r][c] = cnt;	
}
P deq() {	return Que[s++];	}

bool check(int r, int c) {
	//범위를 벗어나지 않고, 저글링이면 True 리턴
	if (r < 1 || c < 1 || r > R || c > C) return false;
	if (grid[r][c] == 1) return true;
	else return false;
}

void BFS() {
	enq(SR, SC, 3);
	P curP;
	while (s <= e) {
		curP = deq();
		for (int i = 0; i < 4; i++) {
			if (check(curP.r + dr[i], curP.c + dc[i])) { //저글링이면
				//감염되어 죽는시간으로 체크하여 Enque
				enq(curP.r + dr[i], curP.c + dc[i], curP.cnt + 1);
			}
		}
	}
}

int main(void) {
	int lastcnt = 3, livecnt = 0;
	scanf("%d%d", &C, &R);
	//Input
	for (int r = 1; r <= R; r++) //[1, R] 에 대입
		for (int c = 1; c <= C; c++) scanf("%1d", &grid[r][c]);
	scanf("%d%d", &SC, &SR);
	//저글링 감염 수행
	BFS();
	//감염 전부 수행 후 체크
	for (int r = 1; r <= R; r++)
		for (int c = 1; c <= C; c++) {
			//안 죽고 살아있는 저글링 체크
			if (grid[r][c] == 1) livecnt++; 
			//가장 마지막에 죽은 저글링 시간 체크
			else if (grid[r][c] > lastcnt) lastcnt = grid[r][c];
		}
	printf("%d\n%d\n", lastcnt, livecnt);
	return 0;
}
반응형