반응형
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=734&sca=99&sfl=wr_hit&stx=1462
#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 |