Заполнение спиралью из центра

Пусть у нас есть число 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. 
Теги:
массив
Добавлено: 21 Сентября 2013 01:49:42 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...