프로그래밍 알고리즘

[정올 1462] 보물섬

꾸준한사람 2023. 1. 5. 01:02
반응형

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

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

int R, C, dr[4] = { 1, -1, 0, 0 }, dc[4] = { 0 , 0, 1, -1 }, chkmap[55][55], s, e, maxDist;
char map[55][55]; //W는 바다, L은 땅, M은 시작점을 해봤던 땅
struct P {
	int r, c, hour;
} que[10000];

void enque(int r, int c, int dist) {
	que[e].r = r, que[e].c = c, que[e++].hour = dist;
	chkmap[r][c] = dist;
	if (maxDist < dist) maxDist = dist;
}
P deque() { return que[s++]; }
void initChkMap() {
	for (int r = 0; r < R; r++)	for (int c = 0; c < C; c++) chkmap[r][c] = 0;
}
bool check(int r, int c) {
	if (r < 0 || c < 0 || r >= R || c >= C) return false;
	if (chkmap[r][c] == 0 && map[r][c] == 'L') return true;
	else return false;
}
void BFS(int r, int c) {
	initChkMap();
	s = e = 0;
	enque(r, c, 1);
	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.hour + 1);
			}
		}
	}
}
//2500*2500 = 625만
int main(void) {
	//freopen("input.txt", "r", stdin);
	scanf("%d%d", &R, &C);
	for (int r = 0; r < R; r++) scanf("%s", map[r]);

	//모든 L에 대해 시작점으로 잡고 BFS 진행
	for (int r = 0; r < R; r++)
		for (int c = 0; c < C; c++) {
			if (map[r][c] == 'L') BFS(r, c);
		}

	printf("%d\n", maxDist - 1);
	return 0;
}
반응형

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

[정올 1534] 10진수를 2,8,16진수로  (0) 2023.01.05
[정올 1516] 단어 세기  (1) 2023.01.05
[정올 1457] 영역 구하기  (0) 2023.01.05
[정올 1419] 엔디안  (0) 2023.01.04
[정올 1411] 두 줄로 타일 깔기  (0) 2023.01.03