Заполнение матрицы по спирали, начиная с центральной клетки, против часовой стрелки - Pascal ABC
Формулировка задачи:
Никак не могу разобраться с чего начать. Помогите, пожалуйста.
Дано число n. Создайте массив A[2*n+1][2*n+1] и заполните его по спирали, начиная с числа 0 в центральной клетке A[n+1][n+1]. Спираль выходит вверх, далее закручивается против часовой стрелки.
Входные данные Программа получает на вход одно число n. Выходные данные Программа должна вывести полученный массив, отводя на вывод каждого числа ровно 3 символа.Примеры
Входные данные
2Выходные данные
Решение задачи: «Заполнение матрицы по спирали, начиная с центральной клетки, против часовой стрелки»
textual
Листинг программы
uses crt;
var a:array[1..21,1..21] of integer;
n,m,k,z,x,y:integer;
begin
repeat
write('Введите число от 1 до 10 n=');
readln(n);
until n in [1..10];
m:=2*n+1;
x:=n+1;
y:=n+1;
k:=0;
for z:=1 to m*m do
begin
a[x,y]:=z-1;
case k mod 4 of
0:begin
dec(x); //вверх
if m-x=y then inc(k);//поворот
end;
1:begin
dec(y);//влево
if x=y then inc(k);//поворот
end;
2:begin
inc(x);//вниз
if m-x+1=y then inc (k);//поворот
end;
3:begin
inc(y); //вправо
if y=x then inc(k);//поворот
end;
end;
end;
for x:=1 to m do
begin
for y:=1 to m do
write(a[x,y]:3);
writeln;
end;
end.
Объяснение кода листинга программы
- Создается переменная
a, которая представляет собой матрицу размером от 1 до 21 в каждой из 21 строки. - Пользователю предлагается ввести число от 1 до 10 для переменной
n. Это число будет определять размер матрицы. - Переменные
m,xиyустанавливаются равными2*n+1,n+1иn+1соответственно. Они будут использоваться для перемещения по матрице. - Переменная
kустанавливается равной 0. Она будет использоваться для отслеживания текущего положения в матрице. - В цикле
forпроисходит заполнение матрицы. Для каждого элементаa[x,y]выполняется следующее:a[x,y]:=z-1;- элементa[x,y]устанавливается равнымz-1. Здесьz- это текущий индекс элемента, который будет заполняться.- В зависимости от значения
kвыполняется поворот или движение по матрице:if m-x=y then inc(k);- еслиm-xравноy, то значениеkувеличивается на 1. Это означает движение вверх.if x=y then inc(k);- еслиxравноy, то значениеkувеличивается на 1. Это означает движение влево.if m-x+1=y then inc (k);- еслиm-x+1равноy, то значениеkувеличивается на 1. Это означает движение вниз.if y=x then inc(k);- еслиyравноx, то значениеkувеличивается на 1. Это означает движение вправо.
- После завершения цикла
forпроисходит вывод матрицы. Для каждого элементаa[x,y]выводится его значение, используя форматa[x,y]:3. Затем выводится символ новой строкиwriteln;. - Цикл
forповторяется, пока значениеnостается больше 0.