티스토리 뷰

알고리즘/백준

백준 / 2589 보물섬 C++

4567은 소수 2021. 2. 20. 03:31

www.acmicpc.net/problem/2589

 

2589번: 보물섬

보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서

www.acmicpc.net

지도가 주어졌을 때 보물이 묻힌 곳의 이동시간을 구하는 문제입니다. 보물은 두 섬의 최단 거리가 가장 긴 두 점에 묻혀있습니다. 지도 상의 최단 거리를 구하므로 BFS를 이용하면 됩니다. 

 

BFS를 이용하여 모든 섬을 시작점으로 잡은 뒤 지도의 모든 섬에 대해 계산하고, check와 dist를 초기화하는 것을 반복하면 됩니다. 

 

코드는 다음과 같습니다.

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<string>
#include<queue>

using namespace std;

int r, c;
char map[51][51];
int dist[51][51];
bool check[51][51];
int result;

int dy[4] = { 0,0,-1,1 };
int dx[4] = { 1,-1,0,0 };

void make_map()
{
	cin >> r >> c;
	for (int i = 0; i < r; i++){
		for (int j = 0; j < c; j++) {
			cin >> map[i][j];
		}
	}
}

void init()
{
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			dist[i][j] = 0;
			check[i][j] = false;
		}
	}
}

int bfs(int Y, int X)
{
	queue<pair<int, int>>q;
	q.push({ Y,X });
	int res = 0;
	dist[Y][X] = 0;
	check[Y][X] = true;

	while (!q.empty())
	{
		int y = q.front().first;
		int x = q.front().second;
		int d = dist[y][x];

		q.pop();
		res = max(res, d);

		for (int i = 0; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];

			if (ny >= 0 && ny < r && nx >= 0 && nx < c) {
				if (check[ny][nx]==false && map[ny][nx] == 'L') {
					q.push({ ny,nx });
					dist[ny][nx] = dist[y][x] + 1;
					check[ny][nx] = true;
				}
			}
		}
	}

	return res;
}

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

	make_map();

	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			if (map[i][j] == 'L') {
				init();
				result = max(result, bfs(i, j));
			}
		}
	}

	cout << result;
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 17472 다리 만들기 2 C++  (0) 2021.02.23
백준 / 15685 드래곤 커브 C++  (0) 2021.02.22
백준 / 7869 두 원 C++  (0) 2021.02.19
백준 / 20040 사이클 게임 C++  (0) 2021.02.19
백준 / 4803 트리 C++  (0) 2021.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함