둘레(Bronze)(FloodFill)

exsoul·2022년 6월 15일
0

문제 설명


농부 존은 그의 들판에 N(1≤N≤10,000)개의 건초 더미를 놓으려 한다. 들판은 1*1 크기의 사각형으로 구성된 100*100 크기이고, 건초 더미들은 각각 1*1 크기의 사각형 한 칸을 차지한다. (한 칸에 두 개의 건초 더미가 놓이는 일은 없다)

농부 존은 건초 더미로 연결된 다양한 형태의 하나의 큰 영역이 생기는 것을 알았다. 즉, 건초 더미들 모두 인접한 (동서남북으로 한 칸) 곳에 다른 건초 더미가 있다. 한 건초 더미에서 출발해서 다른 모든 건초 더미에 도달할 수 있다. 건초 더미로 연결된 영역은 “구멍”을 포함하고 있다. 구멍은 건초 더미로 완전히 둘러싸인 빈 영역이다.

농부 존이 건초 베일에 의해 형성되는 영역의 둘레를 계산하는 것을 도와주시오. “구멍”은 둘레에 영향을 주지 않는다.

입력 설명


첫 번째 줄에 건초 더미의 수 N이 입력된다. (1≤N≤10,000)
두 번째 줄부터 N줄에 걸쳐 건초 더미가 놓인 곳의 위치 X(가로), Y(세로)가 공백으로 구분되어 입력된다. X, Y 모두 정수이고 1이상 100이하이다.

출력 설명


건초 더미로 연결된 영역의 둘레의 길이를 출력하라.

입력 예시


8
5 3
5 4
8 4
5 5
6 3
7 3
7 4
6 5

출력 예시


14

#include <stdio.h>
#include <string.h>
#define MAXN ((int)1e4)
int N;
int X[MAXN+10];
int Y[MAXN+10];
 
int map[100+10][100+10];
int SH, SW, EH, EW;
int len;
int dh[] = {-1, 1, 0, 0};
int dw[] = {0, 0, -1, 1};
void FloodFill(int h, int w){
    if ((h<SH)||(h>EH)||(w<SW)||(w>EW)) return;//범위 벗어남
    if (map[h][w]==1){//둘레
        len++;
        return;
    }
    if (map[h][w] != 0) return;
    map[h][w]=2;
    for (int i=0; i<4; i++){
        FloodFill(h+dh[i], w+dw[i]);
    }
}
int Solve(void){
    //0.초기화
    memset(map, 0, sizeof(map));
    //1.map 배열 건초더미 표시
    SH = SW = 100;
    EH = EW = 0;
    for (int i=0; i<N; i++){
        map[Y[i]][X[i]]=1;
        if (SH > Y[i]) SH = Y[i];//세로 하한
        if (SW > X[i]) SW = X[i];//가로 하한
        if (EH < Y[i]) EH = Y[i];//세로 상한
        if (EW < X[i]) EW = X[i];//가로 상한
    }
    SH--; SW--; EH++; EW++;
    //2.둘레 구하기
    len = 0;
    FloodFill(SH, SW);
    return len;
}
 
void InputData(void){
    scanf("%d", &N);
    for (int i=0 ; i<N ; i++){
        scanf("%d %d", &X[i], &Y[i]);
    }
}
 
int main(void){
    int ans = -1;
    InputData();// 입력받는 부분
 
    ans = Solve();// 여기서부터 작성
 
    printf("%d\n", ans);// 출력하는 부분
    return 0;
}
profile
ocho

0개의 댓글