(백준 알고리즘 문제풀이) 2468번 안전 영역
by 줌코딩
문제
문제 접근
- 이 문제는 bfs를 이용하면 손쉽게 풀 수 있는 문제이다.
- 수심의 높이를 계속 높여가면서 그룹의 개수가 몇개인지를 찾아주며 가장 그룹개수가 큰 경우를 찾으면 된다.
코드
#include <cstdio>
#include <queue>
#include <vector>
#define pii pair<int, int>
using namespace std;
int n, arr[101][101], sinked[101][101], visited[101][101], MAX;
int d[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
int main(){
scanf("%d", &n);
for(int i = 1; i < n + 1; i++){
for(int j = 1; j < n + 1; j++)scanf("%d", &arr[i][j]);
}
for(int k = 1; k < 101; k++){
for(int i = 1; i < n + 1; i++){
for(int j = 1; j < n + 1; j++){
visited[i][j] = 0;
if(arr[i][j] < k)sinked[i][j] = 0;
else sinked[i][j] = 1;
}
}
int cnt = 0;
for(int i = 1; i < n + 1; i++){
for(int j = 1; j < n + 1; j++){
if(sinked[i][j] && !visited[i][j]){
queue<pii> q;
q.push(pii(i,j));
visited[i][j] = 1;
while(!q.empty()){
int fx = q.front().first, fy = q.front().second; q.pop();
for(int i = 0; i < 4; i++){
int nx = fx + d[i][0], ny = fy + d[i][1];
if(!sinked[nx][ny] || visited[nx][ny]) continue;
visited[nx][ny] = 1;
q.push(pii(nx, ny));
}
}
cnt++;
}
}
}
if(cnt > MAX)MAX = cnt;
}
printf("%d", MAX);
}
느낀점
- bfs만 잘 이용할 수 있다면 간단히 풀어낼 수 있는 문제이다!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Subscribe via RSS