Заполнение спиралью из центра
Пусть у нас есть число n. Создадим матрицу порядка 2*n+1 и заполним его по примеру (n=2):
12 11 10 9 24
13 2 1 8 23
14 3 0 7 22
15 4 5 6 21
16 17 18 19 20
"Старт" находится в точке с координатами (n+1,n+1)
Реализация:
var a:array [1..100,1..100] of integer;
i,j,s,x,y,n:integer;
napr,shag:byte;
begin
readln(n); {считываем n}
x:=n+1; {координаты текущей клетки}
y:=n+1;
shag:=1; {количество элементов в витке спирали}
napr:=1; {направление движения}
s:=-1; {счетчик, увеличиваемый на 1}
repeat
begin
for j:=1 to 2 do {нетрудно заметить, что каждые два витка одинаковы по длине(см. пример)}
begin
for i:=1 to shag do {поэтому мы можем заполнять по два витка с одним шагом}
begin
inc(s);
a[x,y]:=s; {заполняем текущий элемент}
if (napr=1) then dec(x);
if (napr=2) then dec(y); {выбор направления движения}
if (napr=3) then inc(x);
if (napr=4) then inc(y);
end;
inc(napr); {изменяем напрвление}
if (napr=5) then napr:=1;
end;
inc(shag); {два витка пройдены, поэтому увеличиваем размер шага}
end;
until (shag=2*n+1); {единственный минус - последний столбец остается незаполненным, поэтому}
for i:=2*n+1 downto 1 do {заполняем его}
begin
inc(s);
a[i,2*n+1]:=s;
end;
for i:=1 to 2*n+1 do
begin
for j:=1 to 2*n+1 do
write(a[i,j]:4); {выводим массив}
writeln;
end;
readln
end.
Комментарии:
Нету комментариев для вывода...