• Уважаемый посетитель!!!
    Если Вы уже являетесь зарегистрированным участником проекта "миХей.ру - дискусcионный клуб",
    пожалуйста, восстановите свой пароль самостоятельно, либо свяжитесь с администратором через Телеграм.

Вывод массива по спирали (Паскаль)

AwfulKitten

Участник
Есть простая задача. Вывести числа в массиве по спирали, например:
01 02 03 04
12 13 14 05
11 16 15 06
10 09 08 07

Для такого варианта задача решена.

var
s:array[1..n,1..m] of integer;
i,j,k,p:integer;

begin
i:=0; k:=0; p:=1;

while i<n*m do
begin
k:=k+1;

for j:=k to m-k+1 do
begin
i:=i+1;
s[k,j]:=p;
p:=p+1;
end;

for j:=k+1 to n-k+1 do
begin
i:=i+1;
s[j,m-k+1]:=p;
p:=p+1;
end;

for j:=m-k downto k do
begin
i:=i+1;
s[n-k+1,j]:=p;
p:=p+1;
end;

for j:=n-k downto k+1 do
begin
i:=i+1;
s[j,k]:=p;
p:=p+1;
end
end;

for i:=1 to n do
begin
for j:=1 to m do
write(s[i,j]:4,' ');
writeln
end
end.

Но дальше - больше =)
Спираль может начинаться с любого внешнего элемента. Как это сделать?? Никто не подскажет??
 
В данном виде задача выглядит "заполнить квадратную матрицу (двумерный массив) числами от 1 до 16 в виде спирали"

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

Пример:

Код:
14 15 16 01 02
13 XX 17 18 03
12 23 XX 19 04
11 22 21 20 05
10 09 08 07 06

Так? И если так - как дальше продолжать?
 
Так:
14 15 16 01 02
13 24 17 18 03
12 23 25 19 04
11 22 21 20 05
10 09 08 07 06

Либо так:
14 15 16 01 02
13 23 24 17 03
12 22 25 18 04
11 21 20 19 05
10 09 08 07 06
 
AwfulKitten

Второй вариант для заполнения проще. Будем ориентироваться на него.

Так... Вопрос подумать: пусть задана матрица NxN. Сколько элементов будет на внешнем квадрате?

Так вот - назовем это число - r.

Таким образом стартовое место можно задать либо числом q<=r, либо номером ячейки. Это - по вкусу.

Теперь возьмем прогонку по четырем сторонам.

В нашем случае для N=5 она распечатает
Код:
01 02 03 04 05
16 XX XX XX 06
и т.д.

Или если это вытянуть в строку - будет последовательно печатать 01 02 03 ... 15 16.

В Паскале есть операция остаток от деления: A mod B
Если мы возьмем этот массив по модулю 16, то получим 01 02 03 ... 15 00.
Если нужно сдвинуть этот ряд на q ячеек, тогда нужно брать (A+q) mod 16
Сдвиг на три ячейки выглядит так: 14 15 00 01 ... 12 13.
К каждой ячейке можно прибавить число. Так как у нас ряд начинается с единицы, то выражение будет вида ( (A+q) mod 16 ) + 1
Это даст 15 16 01 02 ... 13 14.

Таким образом с помощью нехитрого выражения ( (A+q) mod 16 ) + 1
мы получаем сдвинутый внешний квадрат.

Теперь заполняем следующий квадрат той же идеей, только q будет другим, и начинать нужно не с единицы, а с 17. Все эти новые параметры вычисляются до возврата в начало основного цикла.
 
Назад
Сверху