백준 2589 : 보물섬
https://www.acmicpc.net/problem/2589
1. 접근
- 결국 가장 먼 두 지점을 구하는 문제이고, "가장" 긴 거리를 구하는 문제에는 BFS가 가장 적절하다. (한번에 한단계씩 이동하기때문에 가장 길거나, 가장 짧은 거리를 구할 때에는 BFS가 더 적절하다)
- 초기 지도를 입력받고, 그 지도의 값을 BFS로 1씩 더해주면서 가장 큰 값을 택하면 된다.
- 전체 변수 값이 작기 때문에 모든 L 값에 대해 BFS를 구해주었다. 입장할때마다 초기 지도값을 복사해주었다.
+2차원 배열 복사는 copy를 이용했다.
+초기 카운트값을 0으로 설정하고 풀었었는데, 0으로 하면 다른 케이스가 들어가서 오답이 된다고 해서, 1로 설정하고 마지막에 1을 빼주었다. 아마 초기 카운트와 그냥 L값을 구분하기 어려워서 그런것같다.
2. 나의 풀이
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n, m;
int map[51][51];
int input[51][51];
bool visited[51][51];
int maxval = 0;
int dc[4] = { -1,1,0,0 };
int dr[4] = { 0,0,-1,1 };
void BFS(int x, int y) {
queue<pair<pair<int, int>, int>> q;
q.push(make_pair(make_pair(x, y), 1));
visited[x][y] = true;
while (!q.empty()) {
int c = q.front().first.first;
int r = q.front().first.second;
int count = q.front().second;
q.pop();
if (count > maxval) maxval = count;
for (int i = 0; i < 4; i++) {
int nc = c + dc[i];
int nr = r + dr[i];
if (nc >= 0 && nc < n && nr>=0 && nr < m) {
if (map[nc][nr] ==0&&!visited[nc][nr]) {
q.push(make_pair(make_pair(nc, nr), count + 1));
map[nc][nr] = count + 1;
visited[nc][nr] = true;
}
}
}
}
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++) {
string tem;
cin >> tem;
for (int j = 0; j < m; j++) {
if (tem[j] == 'W') input[i][j] = -1;
else if (tem[j] == 0) input[i][j] = 0;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (input[i][j]==0) {
copy(&input[0][0], &input[0][0] + 51*51, &map[0][0]);
memset(visited, false, sizeof(visited));
BFS(i, j);
}
}
}
cout << maxval-1<< "\n";
return 0;
}
Author And Source
이 문제에 관하여(백준 2589 : 보물섬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jeongopo/백준-2589-보물섬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)