Показано с 1 по 4 из 4

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

  1. #1
    Группа удаления Аватар для AwfulKitten
    Регистрация
    26.11.2003
    Адрес
    Северный, холодный, но любимый
    Сообщений
    119
    Спасибо
    я - 0; мне - 0

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

    Есть простая задача. Вывести числа в массиве по спирали, например:
    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.

    Но дальше - больше =)
    Спираль может начинаться с любого внешнего элемента. Как это сделать?? Никто не подскажет??
    Буду я пока без подписи...

  2. #2
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    В данном виде задача выглядит "заполнить квадратную матрицу (двумерный массив) числами от 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
    Так? И если так - как дальше продолжать?

  3. #3
    Группа удаления Аватар для AwfulKitten
    Регистрация
    26.11.2003
    Адрес
    Северный, холодный, но любимый
    Сообщений
    119
    Спасибо
    я - 0; мне - 0
    Так:
    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
    Буду я пока без подписи...

  4. #4
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    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. Все эти новые параметры вычисляются до возврата в начало основного цикла.

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •