백준/완전 탐색

[백준 2589번 / C++] 보물섬

배발자 2022. 1. 14.
반응형

완전 탐색 문제이다. 

 

먼저 map이 [3][4] 배열로 주어진다면 {0,0} ~ {2,3} 까지 총 12개의 좌표값을 하나하나 현위치로 판단해서 갈 수 있는 최대 거리를 구하라는 것이다.  

 

즉, bfs() 를 활용해서 현위치에서 바다가 아닌 육지로 갈 수 있는 거리를 계속해서 갱신하고 최댓값을 구해나가는 것이다. 

 

map[3][4]가 주어진다고 가정을 하고, "W = 0 , L = 1" 라고 보기 쉽게 숫자로 표현하였다.

그리고 map 크기만큼 check 라는 배열을 생성 해준다.

 

먼저 {0,3} 지점을 먼저 살펴보자. 

다음 그림을 보면 현위치에서 갈 수 있는 길이 있을 때마다 숫자를 갱신해나간다. 

모든 맵을 다 살펴보고 나면 최댓값이 3이라는 것을 알 수 있다. 그렇기 때문에  result라는 표에서 {0,3} 지점에서의 숫자는 {0,3}라는 현위치에서 갈 수 있는 최대 거리라고 생각하면 된다. 

 

실제 구현에서는 result 배열을 따로 생성하지 않고 최댓값인지 비교를 해서 구현을 하였다. 

또한, 첫 시작점의 거리값을 1로 설정을 해두었기 때문에 결과를 출력할 때는 result-1 을 출력하도록 하였다. 

 

#include <iostream>
#include <queue>
#include <tuple>
using namespace std; 
int map[50][50]; 
int check[50][50]; 
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 }; 
int h, w;
int result = -1; 
queue <pair<int, int>> q; 
void bfs() {
	int x, y, nx, ny;
	while (q.size()) {
		tie(y, x) = q.front();
		q.pop(); 
		for (int i = 0; i < 4; i++) {
			nx = x+ dx[i]; 
			ny = y+ dy[i]; 
			if (nx < 0 || nx >= w || ny < 0 || ny >= h)continue; //map 범위 넘었을 때
			if (map[ny][nx] == 0 || check[ny][nx])continue; //바다거나 이미 체크된곳이면
			check[ny][nx] = check[y][x] + 1;//현지점+1 값을 조건 만족시 상하좌우에 갱신.
			result = max(check[ny][nx], result); //result 값 비교해서 최댓값이면 갱신.
			q.push({ ny,nx }); //queue에 다시 집어넣기
		}
	}
}

int main() {
	cin >> h >> w; 
	for (int i = 0; i < h; i++) {
		string s = ""; cin >> s; 
		for (int j = 0; j < w; j++) {
			if (s[j] == 'W')map[i][j] = 0; 			
			else map[i][j] = 1; 			
		}
	}
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			if (map[i][j] == 1) {
				check[i][j] = 1; 
				q.push({ i,j });
				bfs(); 
				for (int k = 0; k < h; k++) {
					for (int z = 0; z < w; z++) {
						check[k][z] = 0; 
					}
				}
			}
		}
	}
	cout << result-1; 
}
 

2589번: 보물섬

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

www.acmicpc.net

 

반응형

'백준 > 완전 탐색' 카테고리의 다른 글

[백준 2529번 / C++] 부등호  (0) 2022.02.19
[백준 1107번 / C++] 리모컨  (0) 2022.02.14
[백준 14502번 / C++] 연구소  (0) 2022.01.28
[백준 14620번 / C++] 꽃길  (0) 2022.01.25
[백준 1189번 / C++] 컴백홈  (0) 2022.01.25

댓글