본문 바로가기
프로그래밍/알고리즘 문제풀이

[백준] [c++] 2589 번 보물섬

by 엽기토기 2020. 8. 6.
반응형

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

2589번: 보물섬

2589번 제출 맞은 사람 숏코딩 풀이 풀이 작성 풀이 요청 재채점/수정 채점 현황 강의 보물섬 시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율 1 초 128 MB 11528 4609 3304 40.068% 문제 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데...

www.acmicpc.net

보물섬 성공

시간 제한

메모리 제한

제출

정답

맞은 사람

정답 비율

1 초

128 MB

11528

4609

3304

40.068%

문제

보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 이동은 상하좌우로 이웃한 육지로만 가능하며, 한 칸 이동하는데 한 시간이 걸린다. 보물은 서로 간에 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳에 나뉘어 묻혀있다. 육지를 나타내는 두 곳 사이를 최단 거리로 이동하려면 같은 곳을 두 번 이상 지나가거나, 멀리 돌아가서는 안 된다.

예를 들어 위와 같이 지도가 주어졌다면 보물은 아래 표시된 두 곳에 묻혀 있게 되고, 이 둘 사이의 최단 거리로 이동하는 시간은 8시간이 된다.

보물 지도가 주어질 때, 보물이 묻혀 있는 두 곳 간의 최단 거리로 이동하는 시간을 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 보물이 묻혀 있는 두 곳 사이를 최단 거리로 이동하는 시간을 출력한다.

bfsㅋㅋ

 

#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;

queue<pair<int, int>>q;
pair<int, int>p;
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,1,0,-1 };
char arr[51][51];
int d[51][51];
bool check[51][51];
int tmp[51][51];
int n, m; //세로n 가로m
priority_queue<int> mindis;

void bfs(int y, int x) {
	memset(check, false, sizeof(check));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			tmp[i][j] = d[i][j];
		}
	}
	int result = 0;

	q.push({ y, x });
	int ny;
	int nx;
	check[y][x] = true;
	while (!q.empty()) {
		p = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			ny = p.first + dy[i];
			nx = p.second + dx[i];
			if (0 <= ny&&ny < n && 0 <= nx&&nx < m&&tmp[ny][nx] == 0&&check[ny][nx] == false) {
				check[ny][nx] = true;
				tmp[ny][nx] = tmp[p.first][p.second] + 1;
				if (result < tmp[ny][nx]) result = tmp[ny][nx];
				q.push({ ny,nx });
			}
		}
	}
	mindis.push(result);
}
void prin(void) {
	cout << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << tmp[i][j] << "  ";
		}
		cout << endl;
	}
	cout << endl;
}

int main() {
	memset(d, -1, sizeof(d));
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> arr[i][j];
			if (arr[i][j] == 'L') {
				d[i][j] = 0;
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (arr[i][j] == 'L') {
				bfs(i, j);
				//prin();
			}
		}
	}
	cout << mindis.top();
}

반응형