Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 14863
- 브루트포스
- Crossfit
- 4811
- dart
- 15662
- DP
- spring boot
- D1
- 1781
- sw expert academy
- 서울에서경산까지
- 스택
- C++
- 삼성
- 15353
- 재귀함수
- 크로스핏
- 동적프로그래밍
- 백준
- BOJ
- 1로만들기2
- 그리디
- Python
- 26008
- 해시해킹
- Flutter
- BOJ14889
- 재귀
- 회전하는큐
Archives
- Today
- Total
곧죽어도 콛잉
[브루트 포스 / BOJ 2589 / C++] 보물섬 본문
https://www.acmicpc.net/problem/2589
2589번: 보물섬
보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서
www.acmicpc.net
1) 모든 L에 대해 bfs를 해준다.
1-1) 이때, 가중치로 나온 더해진 값들을 확인해나가며 res를 갱신한다.
2) res-1를 출력한다.
이 문제는 bfs 개념을 알고 있다면 쉽게 풀린다!
L를 만날때마다 bfs를 수행해보자. 그렇다면,
위 그림에서 파란색으로 색칠한칸은 W, 빨강색 칸은 L이다. 이때 (0,0)(빨강색 숫자 1)에서 bfs를 시작할 경우, 가중치 1를 더한다 생각한다면, 위의 그림과 같이 보인다.
이번에는 (1,0)에서 bfs를 시작했다. (0,0)에서 시작할 경우와 차이를 보인다. 즉, 임의의 2칸의 최단 거리는 어디서 시작하냐에 따라 다르다. 그렇기 때문에 모든 L에 대해 bfs를 해주고, 그 중 가중치를 더해나간 값중 가장 큰 값을 선택한다!
결국은 그냥 모든 L에 대해 bfs를 구해주면 해결되는 쉬운문제!
(나는 처음에 임의의 땅 2개를 골라서(조합으로) bfs를 돌려줬는데 시간복잡도가 오바됐다.. 그런데 더 단순한 방법이 있었다.)
#include <bits/stdc++.h>
using namespace std;
int N, M, res;
int vis[54][54];
char bd[54][54];
string s;
int dy[4] = {0, -1, 0, 1};
int dx[4] = {1, 0, -1, 0};
void bfs(int i, int j){
memset(vis, 0, sizeof(vis));
queue<pair<int,int>> Q;
Q.push({i,j}); // Q삽입
vis[i][j] = 1; // 방문표시
while(!Q.empty()){
pair<int, int> cur = Q.front(); Q.pop();
for(int dir = 0 ; dir < 4 ; dir++){
int ny = cur.first + dy[dir];
int nx = cur.second + dx[dir];
if(ny >= N || nx >= M || ny < 0 || nx < 0) continue;
if(bd[ny][nx]=='W' || vis[ny][nx]!=0) continue; // 방문했거나 물이면 pass
Q.push({ny, nx});
vis[ny][nx] = vis[cur.first][cur.second] + 1;
res = max(res, vis[ny][nx]);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for(int i = 0 ; i < N ; i++){
cin >> s;
for(int j = 0 ; j < M ; j++){
bd[i][j] = s[j];
}
} // 입력 받기
for(int i = 0 ; i < N ; i++){
for(int j = 0 ; j < M ; j++){
if(bd[i][j]=='L') bfs(i, j);
}
} // 모든 L에 대해 bfs 수행
cout << res-1;
}
'Coding Test > C++' 카테고리의 다른 글
[브루트 포스 / BOJ 2529 / C++] 부등호 (0) | 2023.03.19 |
---|---|
[브루트 포스 / BOJ 14497 / C++] 주난의 난(難) (0) | 2023.03.18 |
[브루트 포스 / BOJ 15686 / C++] 치킨 배달 (0) | 2023.03.12 |
[그래프 / BOJ 17825 / C++] 주사위 윷놀이 (0) | 2023.03.12 |
[완전탐색 / BOJ 1189 / C++] 컴백홈 (0) | 2023.03.08 |
Comments