풀이
BFS로 맵을 다 돌아주면 된다. 최댓값을 찾아야 하기 때문에 시작점을 바꿔가면서 BFS 돌린다.
참고로 Max - 1을 결과로 출력해야 하는데 -1을 하는 이유는 visit_y_x= 1을 항상 하기 때문에 원하는 결과 값보다 항상 +1이 되기 때문이다.
코드
#include <bits/stdc++.h>
using namespace std;
int w, h;
char Map[51][51] = {
0,
};
int BFS(int y, int x)
{
int MAX = 0;
int visit[51][51] = {
0,
};
const int dx[] = {0, -1, 1, 0};
const int dy[] = {-1, 0, 0, 1};
queue<pair<int, int>> q;
q.push(make_pair(y, x));
visit[y][x] = 1;
while (!q.empty())
{
int xx = q.front().second;
int yy = q.front().first;
q.pop();
if (visit[yy][xx] > MAX)
MAX = visit[yy][xx];
for (int i = 0; i < 4; ++i)
{
int nextX = dx[i] + xx;
int nextY = dy[i] + yy;
if (0 <= nextX && nextX < w && 0 <= nextY && nextY < h && visit[nextY][nextX] == 0 && Map[nextY][nextX] == 'L')
{
visit[nextY][nextX] = visit[yy][xx] + 1;
q.push(make_pair(nextY, nextX));
}
}
}
return MAX;
}
int main()
{
scanf("%d %d", &h, &w);
for (int i = 0; i < h; ++i)
{
scanf("%s", Map[i]);
}
int Max = 0;
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
{
if (Map[i][j] == 'L')
{
int rtn = BFS(i, j);
if (rtn > Max)
Max = rtn;
}
}
}
printf("%d\n", Max - 1);
return 0;
}
'온라인저지' 카테고리의 다른 글
[BOJ] 2588번: 곱셈 (0) | 2018.07.13 |
---|---|
[BOJ] 2609번: 최대공약수와 최소공배수 (0) | 2018.07.13 |
[BOJ] 10800번: 컬러볼 (0) | 2018.07.13 |
[BOJ] 2608번: 로마 숫자 (1) | 2018.07.12 |
[BOJ] 2607번: 비슷한 단어 (0) | 2018.07.12 |
[BOJ] 11048번: 이동하기 (0) | 2018.06.04 |
댓글