Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 16_Рекурсия

.pdf
Скачиваний:
31
Добавлен:
14.03.2016
Размер:
117.24 Кб
Скачать

Рекурсивный алгоритм заливки

Состояние: нахожусь в точке массива Paint с определенными координатами

Закраска фигуры с началом в точке x,y

1.Закрасить точку с текущими координатами (присвоить ей значение 2)

2.Если точка слева от нее не закрашена и не

граница, то закрасить фигуру с началом в точке x- 1,y

3. Аналогично для точек сверху, справа и снизу

11

Задание

Закодировать рекурсивный

алгоритм заливки, в виде функции fill

12

Кодировка рекурсивного алгоритма заливки

void fill(int Paint[N][M],int y, int x)

{

Paint[y][x]=2;//Закрашиваем текущую точку if(x>0 && Paint[y][x-1]==0)//слева

fill(Paint,y,x-1);

if(y>0 && Paint[y-1][x]==0)//сверху fill(Paint,y-1,x);

if(x<M-1 && Paint[y][x+1]==0)//справа fill(Paint,y,x+1);

if(y<N-1 && Paint[y+1][x]==0)//снизу fill(Paint,y+1,x);

}

13

Задание

Обоснуйте конечность рекурсивного алгоритма заливки

14

Конечность рекурсивного алгоритма заливки

Рекурсивный алгоритм заливки не может быть вызван дважды для одной и той же клетки, поскольку он начинает с закраски этой клетки, а заходить можно только в незакрашенную клетку.

Рекурсивный алгоритм заливки закончится, поскольку размер массива конечен, а заходить в одну клетку несколько раз алгоритм не может.

15