알고리즘 : C++/BaekJoon

백준 2589번 - 보물섬 (2회 차)

동 노이만 2023. 6. 2. 16:56

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

 

2589번: 보물섬

첫째 줄에는 보물 지도의 세로의 크기와 가로의 크기가 빈칸을 사이에 두고 주어진다. 이어 L과 W로 표시된 보물 지도가 아래의 예와 같이 주어지며, 각 문자 사이에는 빈 칸이 없다. 보물 지도의

www.acmicpc.net

풀이 과정

 4방향 그래프에서 육지인 곳 중, 최단 거리가 가장 큰 곳의 거리를 구하는 문제이다. 우선 입력을 받고, 모든 노드를 탐색하며 (탐색할 때마다 visited 초기화) visited의 최댓값을 구하며 ret을 최댓값으로 갱신했다.

느낀 점

 기본적인 BFS를 이용한 최단 거리 문제이다.

 

 

#include<bits/stdc++.h>
using namespace std;

const int MAX = 53;
int visited[MAX][MAX], mp[MAX][MAX];
int my[4] = { 1, 0, -1, 0 }, mx[4] = { 0, 1, 0, -1 };
int n, m, ret;
char temp;

//BFS로 탐색하며 최대 visited[][]로 ret갱신
void BFS(int y, int x) {
	queue<pair<int, int>> q;
	visited[y][x] = 1;
	q.push({ y, x });
	while (q.size()) {
		int now_y = q.front().first;
		int now_x = q.front().second;
		for (int i = 0; i < 4; i++) {
			int ny = now_y + my[i];
			int nx = now_x + mx[i];
			if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || !mp[ny][nx])continue;
			visited[ny][nx] = visited[now_y][now_x] + 1;
			ret = max(ret, visited[ny][nx] - 1);
			q.push({ ny, nx });
		}
		q.pop();
	}
	return;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	//입력
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> temp;
			if (temp == 'W') mp[i][j] = 0;
			else mp[i][j] = 1;
		}
	}

	//모든 노드 탐색
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (!mp[i][j]) continue; //육지일 경우에만 탐색
			fill(&visited[0][0], &visited[0][0] + MAX * MAX, 0);
			BFS(i, j); //BFS 탐색
		}
	}
	
	//출력
	cout << ret;

	return 0;
}