Курсовая работа: Работа с двумерными числовыми массивами
29 arr[RowN]:= arr[RowN-1];//текущая строка равна верхней
30 end;
31 arr[1]:= tmpRow;//первую строку приравняем нулевой
32 end;
33 end;
«Разворачивание» матрицы
Процедура UnwindMatrix осуществляет "разворачивание" матрицы в одномерный массив против часовой стрелки. Эта процедура в своих локальных переменных хранит координаты текущего элемента, текущее направление обхода (посредством перечислимого типа TDirection), а так же границы ещё не обойдённой части матрицы, которые сужаются каждый раз, когда проходится целая строка, или столбец. В этот же момент меняется направление обхода и текущим становится элемент в этом направлении. Обход завершается, когда число пройденных элементов станет равняться количеству элементов в матрице:
1 //перечисление - направления
2 type TDirection = (down, right, up, left);
3
4 {обходит матрицу arr против часовой стрелки и наполняет элементами массив res}
5 procedure UnwindMatrix(const arr: TMatrix; var res: TVector);
6 var
7 count, cur: integer;//число элементов в матрице и счётчик элементов
8
9 RowN, ColN: integer;
10 leftB, bottomB, rightB, topB: integer;//границы обхода - меняются при проходе полной строки или столбца
11 direction: TDirection;//текущее направление обхода
12
13 begin
14 if (length(arr) = 0) or (length(arr[0]) = 0) then exit;//если в матрице нет элементов - выходим
15 count:= length(arr) * length(arr[0]);//подсчитаем число элементов в матрице
16 SetLength(res, count);//выделим память для хранения всех элементов матрицы
17
18 //начальные условия обхода: текущий элемент [0,0], границы совпадают с граниуцами матриы, направление - вниз
19 direction:= down;
20 RowN:= 0;
21 ColN:= 0;
22 leftB:= 0;