문제
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(4, 4); // 채우기 실행(시작 위치: 4,4) printf("안쪽을 채우는 순환 호출 함수 작동\n-------------------\n"); result_print(); // flood_fill 함수 호출 뒤 결과(배열) 출력 return 0; } | cs |
결과
'과제 > 자료구조' 카테고리의 다른 글
#6. 학생 정보를 관리하는 이진 탐색트리 구현 (0) | 2020.05.26 |
---|---|
#5. 단순연결리스트를 이용한 정렬리스트 만들기 (0) | 2020.04.22 |
#4. 수식을 후위식으로 변환하고 계산하기 (2) | 2020.04.11 |
#3. 구조체,배열을 이용해 성적정렬하기 (6) | 2020.04.01 |
#1.수행시간을 측정해 결과값 제출 (0) | 2020.03.25 |