문제 

10*10 2차원 배열에서 

YELLOW: 2, BLACK: 1, WHITE: 0 으로 설정하여 다음과 같이 칠해진 좌표가 있다고하자.

X표 되어있는 좌표는 0인 상태이고, (4,4)좌표부터 시작해서 순환함수를 이용하여 모든 0인 좌표를 1로 칠하자.


풀이

반복문으로 작성하면 금방이지만 순환함수를 사용하라고했으므로, 좌표의 색깔을 입히는 함수내부에 

시작 좌표부터 각 방향(동서남북)으로 탐색을 시작하여 모든 0인좌표들을찾아서 1로 바꾸는 순환함수를 작성한다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#define WHITE 0 // 0을 WHITE라 정의
#define BLACK 1 // 1을 BLACK이라 정의
#define YELLOW 2 // 2를 YELLOW라 정의
 
int screen[10][10= // 배열 초기화 후 바로 초기값을 넣어줍니다.
{ {2,2,2,2,2,2,2,2,2,2},
 {2,2,2,2,2,2,2,2,2,2},
 {2,2,2,0,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,2,2,2},
 {2,2,2,2,0,0,0,0,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,0,2,2,2,2,2},
 {2,2,2,2,2,2,2,2,2,2} };
 
// screen 배열을 읽어들이기(순환 호출에서 쓰임)
char read_pixel(int x, int y)
{
    return screen[x][y];
}
 
// 해당 x, y 위치를 color(BLACK)로 채우기(순환 호출에서 쓰임)
void write_pixel(int x, int y, int color)
{
    screen[x][y] = color;
}
 
 //영역 채우기 알고리즘 
void flood_fill(int x, int y)
{
    if (read_pixel(x, y) == WHITE) // read_pixel 함수 호출의 결과로 0을 발견하면
    {
        write_pixel(x, y, BLACK); // write_pixel 함수를 호출해서 BLACK(1)로 채우기
        //동
        if (x + 1 < 10)
            flood_fill(x + 1, y);
        //남
        if (y + 1 < 10)
            flood_fill(x, y + 1);
        //서
        if (x - 1 >= 0)
            flood_fill(x - 1, y);
        //북
        if (y - 1 >= 0)
            flood_fill(x, y - 1); 
    }
}
 
void result_print()
{
    int i, j; // 인덱스 i, j 선언
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            printf("%d ", screen[i][j]); // 10x10 크기의 배열 출력(보여주기)
        }
        printf("\n");
    }
}
 
int main()
{
 
    printf("영역 채우기 대상 도형\n-------------------\n");
    result_print(); // 초기값으로 지정된 배열을 출력 
 
    flood_fill(44); // 채우기 실행(시작 위치: 4,4)
 
    printf("안쪽을 채우는 순환 호출 함수 작동\n-------------------\n");
    result_print(); // flood_fill 함수 호출 뒤 결과(배열) 출력 
 
    return 0;
}
cs


결과



+ Recent posts