Лекции по проге / 16_Рекурсия
.pdf
Рекурсивный алгоритм заливки
Состояние: нахожусь в точке массива 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
