Заполнить двумерный массив по спирали

Я сделал для задачи, где дан квадрат 9х9,а как сделать универсальный код, который работал не только для 9х9?

var a:array[1..100,1..100] of integer;b:array[1..100] of integer; i,k,j:integer;
begin
for i:=1 to 9 do begin
for j:=1 to 9 do begin
a[i,j]:=random(10);
write(a[i,j]:3);
end;
writeln;
end;
writeln;

for k:=1 to 81 do begin

for i:=1 to 9 do
for j:=1 to 9 do

If i=1 then
for j:=1 to 9 do begin
b[k]:=a[1,j];
write(b[k]:2);
end;

If j=9 then
for i:=2 to 9 do begin
b[k]:=a[i,9];
write(b[k]:2);
end;

If i=9 then
For j:= 8 downto 1 do begin
b[k]:=a[9,j];
write(b[k]:2);
end;

If j=1 then
for i:=8 downto 2 do begin
b[k]:=a[i,1];
write(b[k]:2);
end;

If i=2 then
for j:=2 to 8 do begin
b[k]:=a[2,j];write(b[k]:2);
end;

for i:=3 to 8 do begin
b[k]:=a[i,8];write(b[k]:2);
end;

for j:=7 downto 2 do begin
b[k]:=a[8,j];write(b[k]:2);
end;

for i:= 7 downto 3 do begin
b[k]:=a[i,2];write(b[k]:2);
end;

for j:=3 to 7 do begin
b[k]:=a[3,j];write(b[k]:2);
end;

for i:= 4 to 7 do begin
b[k]:=a[i,7];write(b[k]:2);
end;

for j:= 6 downto 3 do begin
b[k]:=a[7,j];write(b[k]:2);
end;

for i:=6 downto 4 do begin
b[k]:=a[i,3];write(b[k]:2);
end;

for j:=4 to 6 do begin
b[k]:=a[4,j];write(b[k]:2);
end;

for i:=5 to 6 do begin
b[k]:=a[i,6];write(b[k]:2);
end;

for j:=5 downto 4 do begin
b[k]:=a[6,j];write(b[k]:2);
end;

Saturday, October 24, 2009

Заполнение массива по спирали

Не так давно пытался разобраться с такой задачей:

Задать массив размерностью NxN с элементами 1,2,3. N*N, так, чтобы эти элементы были записаны в матрицу по спирали.
Т.е. для массив с размерностью 5 должен выглядеть следующим образом:

Ну и в общем я, как обычно, застопорился после задания с клавиатуры размерности. 🙂

Читайте также:  Hl dt st dvdram gt33n

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

Далее будет способ решения, который выбрал мой мозг, прошедший несколько стадий запоров. Серьезно говоря, этот мозг не любит простых путей, поэтому, если есть решение лучше и красивше, не серчайте.

Задание массива я попытался разбить на несколько шагов, эти шаги тоже на несколько, эти. —> infinity :))

1.Задаем внешнюю оболочку массива, т.е.:

Это действие я тоже разбил на несколько шагов:
1.1: Задание верхней строки: 1 2 3 4 5.
1.2: Задание правого столбца: 6 7 8 9.
1.3: Задание нижней строки: 13 12 11 10
1.4: Задание левого столбца: 16 15 14

т.е. нужно будет использовать 4 цикла for

2. Задаем следующую оболочку (пусть будет оболочка №2):

Всё делается аналогично, т.е. эти 4 цикла for будут задавать все возможные "оболочки" . Тогда нужно понять, от чего будут зависеть параметры данных циклов. Разумеется от номера оболочки в которой совершается цикл.

Как будет действовать for, задававший первую строку? Скорее всего, так:
for, задававший правый столбец:
For’ы №3 и №4 действуют абсолютно аналогично, в итоге получаем полностью заполненную матрицу.

Если n-четно, количество оболочек равно n/2. Если нечетно — (int)(n/2)+1.

Эти четыре цикла for и вставлял внутри условия "пока количество оболочек не равно нулю", после каждого прохождения 4ех for’ов количество оболочек уменьшаем на одну, номер оболочки увеличиваем на единицу.

Надеюсь, что смысл вы более-менее поняли, и сможете сами (если, конечно, захотите) написать данную программу. Если же нет.

Опции темы

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

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

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

Читайте также:  Gtx750ti oc 2gd5 характеристики

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

    За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008

В данном виде задача выглядит "заполнить квадратную матрицу (двумерный массив) числами от 1 до 16 в виде спирали"

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

Так? И если так — как дальше продолжать?

Так:
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

    За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008

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

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

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

Таким образом стартовое место можно задать либо числом q