Программа заполнения матрицы по спирали
Программа демонстрирующая спиральный обход матрицы заполняя рядом чисел.
CONST N=19; { Размерность несущей матрицы }
TYPE Matrix=array[1..N,1..N] of integer; { Тип - матрица }
VAR A:Matrix; { Несущая матрица }
Height,Width:1..N; { Фактическая размерность матрицы }
PROCEDURE OutputMatrix(Height,Width:integer; A:Matrix);
{ Процедура вывода матрицы }
Var i,j:integer; { Счетчики }
Begin
Write('┌'); { Вывод элемента рамки }
for j:=1 to Width do Write(' '); { Вывод первой строки (пустой) }
WriteLn('┐'); { Вывод элемента рамки }
for i:=1 to Height do { Цикл вывода строк }
begin
Write('│'); { Вывод элемента рамки }
for j:=1 to Width do Write(A[i,j]:3,' '); { Цикл вывода строки }
WriteLn('│') { Вывод элемента рамки }
end;
Write('└'); { Вывод элемента рамки }
for j:=1 to Width do Write(' '); { Вывод последней строки (пустой) }
WriteLn('┘'); { Вывод элемента рамки }
End;
FUNCTION GetFill(var Fill:integer):integer;
{ Функция определения и переопределения заполнителя }
Begin
GetFill:=Fill; { Определение значения функции }
Fill:=Fill+1 { Переопределение заполнителя }
End;
PROCEDURE GetMatrix(Height,Width:integer; var A:Matrix);
{ Процедура определения матрицы }
Var i:integer; { Счетчик }
Fill:integer; { Заполнитель }
Left,Right,Lo,Hi:integer;
{ Границы сегмента спирали (левая, правая, нижняя, верхняя) }
Begin
{ Начальное определение границ: }
Left:=1; Right:=Width;
Lo:=1; Hi:=Height;
Fill:=1; { Начальное определение заполнителя }
while (Right>=Left)or(Hi>=Lo) do { Цикл заполнения матрицы (по виткам) }
begin
if Hi>=Lo then
begin { Заполнение верхнего сегмента витка }
for i:=Left to Right do A[Lo,i]:=GetFill(Fill);
Lo:=Lo+1 { Переопределение границы }
end;
if Right>=Left then
begin { Заполнение правого сегмента витка }
for i:=Lo to Hi do A[i,Right]:=GetFill(Fill);
Right:=Right-1 { Переопределение границы }
end;
if Hi>=Lo then
begin { Заполнение нижнего сегмента витка }
for i:=Right downto Left do A[Hi,i]:=GetFill(Fill);
Hi:=Hi-1 { Переопределение границы }
end;
if Right>=Left then
begin { Заполнение левого сегмента витка }
for i:=Hi downto Lo do A[i,Left]:=GetFill(Fill);
Left:=Left+1 { Переопределение границы }
end
end
End;
BEGIN
WriteLn; { Пропуск строки }
Randomize;
Height:=Random(N)+1;
Width:=Random(N)+1;
GetMatrix(Height,Width,A); { Получение матрицы }
OutputMatrix(Height,Width,A); { Вывод матрицы }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию