-
[BOJ] #2468 _ 안전 영역Problem Solving/BOJ 2019. 8. 28. 20:03
[안전 영역] https://www.acmicpc.net/problem/2468
bfs나 dfs를 이용하여 안전한 구역의 개수를 세는 문제이다.
[ 소스 코드 ]
#include <cstdio> #include <queue> #include <vector> #include <algorithm> #define MAX 100 using namespace std; int dx[4] = { 0, 0, -1, 1 }, dy[4] = { -1, 1, 0, 0 }; int N, high, result = 1; vector<vector<int> > town; void solve(int sink); int main() { scanf("%d", &N); //input town.assign(N, vector<int>(N, 0)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%d", &town[i][j]); if (high < town[i][j]) high = town[i][j]; } } for (int i = 1; i <= high; i++) solve(i); //use bfs printf("%d\n", result); return 0; } void solve(int sink) { queue <pair<int, int> > q; pair<int, int> tmp; vector<vector<int> > check(N, vector<int>(N, 0)); int x, y, count = 0; for (int i = 0; i < N; i++) { //check sinked place for (int j = 0; j < N; j++) { if (town[i][j] <= sink) check[i][j] = 1; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (check[i][j] == 1) continue; q.push(make_pair(i, j)); check[i][j] = 1; count++; while (!q.empty()) { tmp = q.front(); q.pop(); for (int k = 0; k < 4; k++) { x = tmp.second + dx[k]; y = tmp.first + dy[k]; if (x < 0 || y < 0 || x >= N || y >= N) continue; if (check[y][x] == 1) continue; q.push(make_pair(y, x)); check[y][x] = 1; } } } } result = max(result, count); }
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] #14499 _ 주사위 굴리기 (0) 2019.08.28 [BOJ] #2644 _ 촌수계산 (0) 2019.08.28 [BOJ] #3190 _ 뱀 (0) 2019.08.12 [BOJ] #14889 _ 스타트와 링크 (0) 2019.08.12 [BOJ] #9465 _ 스티커 (0) 2019.08.12 댓글