Link : https://www.acmicpc.net/problem/2468
소스 결과 : 1988 KB / 44 ms
문제 출처 : BackJoon, KOI 2010 초등부 2번
소스코드 설명
BFS 문제
최대 높이까지 전부 탐색해야 하는 경우
처음에 문제 읽을 때 기준이 몇인지 주어져야 하는데 왜 안주어지나 궁금했던 문제
최대 크기가 100 이기에 인접 행렬을 사용
현재 위치를 저장하는 mPoint 구조체를 사용
알고리즘
1. 입력 값을 받으면서 최대 높이를 구한다.
2. 0 ~ 최대 높이까지 반복
2. 1 현재 높이를 기준으로 안전구역 설정
2. 2 생성된 안전구역을 기준으로 BFS 진행
2. 3 구해진 안전구역 수를 현재 최대 구역 수와 비교해 최대 구역수를 설정
3. 2에서 얻어진 최대 구역 수를 출력
소스코드
#include <iostream>
#include <queue>
using namespace std;
struct mPoint {
int x;
int y;
mPoint() {};
mPoint(int x, int y) : x(x), y(y) {};
};
const int posX[4] = { 1, 0, -1, 0 };
const int posY[4] = { 0, 1, 0, -1 };
int func(bool zone[100][100], int n)
{
int fieldCount = 0;
queue<mPoint> q;
bool check[100][100];
for (int i = 0; i < n; i++)
fill_n(check[i], n, false);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (!zone[i][j] || check[i][j])
continue;
q.push(mPoint(i, j));
while (!q.empty())
{
mPoint cur = q.front();
q.pop();
if (check[cur.x][cur.y])
continue;
check[cur.x][cur.y] = true;
// check Field
for (int pos = 0; pos < 4; pos++)
if (0 <= cur.x + posX[pos] && cur.x + posX[pos] < n && 0 <= cur.y + posY[pos] && cur.y + posY[pos] < n)
{
if (zone[cur.x+posX[pos]][cur.y+posY[pos]])
q.push(mPoint(cur.x + posX[pos], cur.y + posY[pos]));
}
}
fieldCount++;
}
return fieldCount;
}
void checkSafe(const int map[100][100],bool zone[100][100], int n, int water)
{
for (int i = 0 ; i < n ;i++)
for (int j = 0; j < n; j++)
{
if (map[i][j] <= water)
zone[i][j] = false;
else
zone[i][j] = true;
}
}
int main()
{
int maxHeight = 0;
int maxCount = 0;
int n;
int map[100][100];
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
cin >> map[i][j];
if (maxHeight < map[i][j])
maxHeight = map[i][j];
}
for (int i = 0; i < maxHeight; i++)
{
bool safeZone[100][100];
checkSafe(map, safeZone, n, i);
int safe = func(safeZone, n);
if (maxCount < safe)
maxCount = safe;
}
cout << maxCount;
return 0;
}
'Algorithm > BFS' 카테고리의 다른 글
BaekJoon 1697 숨바꼭질 (0) | 2019.01.08 |
---|---|
BaekJoon 2667 단지번호붙이기 (0) | 2019.01.05 |
BaekJoon 11724 연결 요소의 개수 (BFS) (0) | 2019.01.01 |
BaekJoon 1325 효율적인 해킹 (0) | 2018.12.31 |
BaekJoon 2644 촌수계산 (0) | 2018.12.28 |