-
백준 2468번: 안전 영역깊이우선탐색(DFS) 2018. 6. 23. 20:34반응형
https://www.acmicpc.net/problem/2468
1. 문제
물에 잠기지 않는 영역을 구하는 문제
2. 알고리즘
키워드 - DFS, FloodFill
높이가 2 일때 다 잠긴다.
높이 3 일 때 안전한 영역 4개
높이 4 일 때 안전 영역 5개
높이 5 일 때 안전 영역 5개
높이 6 일 때 안정 영역 4 개
높이 7 일 때 안전 영역 2 개
높이 8 일 때 안전 영역 1
높이 9 일때 없다.
탐색할 노드의 값이 높이 보다 큰 경우 DFS 탐색 횟수를 카운트 하여 가장 많은 영역을 구한다.
3. 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#include <iostream>#include <sstream>#include <string>#include <algorithm>#include <functional>#include <vector>#include <list>#include <queue>#include <deque>#include <map>#include <set>#include <stack>#include <cstring>#define MAX_SIZE 100#define INF 0x7fffffffusing namespace std;int n;int board[101][101];int visited[101][101];// 상 하 좌 우int dy[] = { 0, -1, 1, 0};int dx[] = { -1, 0, 0, 1};void dfs(int x, int y, int value) {visited[x][y] = 1;// 상 하 좌 우로 이동 하며 탐색for (int i=0; i<4; i++) {int ax = x + dx[i];int ay = y + dy[i];// 배열의 인덱스를 넘지 않도록if (ax < 0 || ay < 0 || ax >= n || ay >= n)continue;if(visited[ax][ay] || board[ax][ay] <= value)continue;dfs(ax, ay, value);}}int main() {std::ios::sync_with_stdio(false); cin.tie(0);cin >> n;int minvalue = 987654321;int maxvalue = 0;for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {int d; cin >> d;board[i][j] = d;minvalue = min(minvalue, d);maxvalue = max(maxvalue, d);}}int sol = 1;for(int x=minvalue; x<=maxvalue; x++) {int cand = 0;for(int i=0; i<n; i++) {for(int j=0; j<n; j++) {if (!visited[i][j] && board[i][j] > x) {cand++;dfs(i, j, x);}}}sol = max(sol, cand);memset(visited, 0, sizeof(visited));}cout << sol << "\n";return 0;}cs 반응형'깊이우선탐색(DFS)' 카테고리의 다른 글
백준 2573번: 빙산 (0) 2018.07.01 백준 10451번: 순열 사이클 (0) 2018.06.24 백준 11724번: 연결 요소의 개수 (0) 2018.06.23 백준 1012번: 유기농 배추(DFS) (0) 2018.06.23 백준 2667번 : 단지번호붙이기 (0) 2018.06.18