본문 바로가기

알고리즘 문제

백준 2589번 보물섬

https://www.acmicpc.net/problem/2589



#include<stdio.h>

#include<queue>

#include<string.h>


using namespace std;

queue <int> qx;

queue <int> qy;

int height, width, i, j, map[51][51], len[51][51], mx, fx[4] = {0,1,0,-1}, fy[4] = { -1,0,1,0 },tmpX,tmpY,x,y;

bool visited[51][51];

char alpha;


void bfs(int i, int j){

visited[i][j] = true;

qx.push(i); qy.push(j);

while (!qx.empty() && !qy.empty()) {

tmpX = qx.front(); qx.pop();

tmpY = qy.front(); qy.pop();

for (i = 0; i < 4; i++) {

x = tmpX + fx[i];// (tmpX, tmpY) 동서남북 탐색

y = tmpY + fy[i];

if (map[x][y] == 1 && !visited[x][y]) { //방문하지 않은 육지이면

visited[x][y] = true;

qx.push(x); qy.push(y);

len[x][y] = len[tmpX][tmpY] + 1; //길이 하나 늘림

if (len[x][y] > mx) mx = len[x][y];

}

}

}

}

int main() {

scanf_s("%d %d", &height, &width);

for (i = 0; i < height; i++) {

getchar();// 개행시 버퍼에 있는 \n을 없애기 위함.

for (j = 0; j < width; j++) {

alpha = getchar(); //한 문자씩 받아서

printf("%d ", alpha);

if (alpha == 'L') { //육지면 map 배열에 1 저장 

map[i][j] = 1;

}

else map[i][j] = 0; //바다면 0 저장

}

}

for (i = 0; i < height; i++) { // 모든 지점 탐색

for (j = 0; j < width; j++) {

if (map[i][j] == 1) {

bfs(i, j);

memset(len, 0, sizeof(len));

memset(visited, 0, sizeof(visited));

}

}


}

printf("%d\n", mx);

return 0;

}