Массив: Змейка, Спираль - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Я на форуме первый день, прошу не судить строго. Я знаю, что похожие темы есть на форуме, я перечитал их всех, но правильного решения на эти задачи не нашел. #Free Pascal Помогите решить эти задачки:

1.

Дано число n. Создайте массив A[2*n+1][2*n+1] и заполните его по спирали, начиная с числа 0 в центральной клетке A[n+1][n+1]. Спираль выходит вверх, далее закручивается против часовой стрелки.

Входные данные

Программа получает на вход одно число n.

Выходные данные

Программа должна вывести полученный массив, отводя на вывод каждого числа ровно 3 символа.

Примеры

входные данные

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 2.Требуется заполнить массив размера N × N единичками по спирали (начиная с верхнего левого угла по часовой стрелке, см. пример).

Входные данные

С клавиатуры вводится число N (нечетное, натуральное и не превышающее 50).

Выходные данные

Требуется вывести на экран построенную спираль.

Примеры

входные данные

7

выходные данные

1111111 0000001 1111101 1000101 1011101 1000001 1111111
3.Даны числа n и m. Создайте массив A[n][m] и заполните его, как показано на примере.

Входные данные

Программа получает на вход два числа n и m.

Выходные данные

Программа должна вывести полученный массив.

Примеры

входные данные

4 10

выходные данные

0 1 3 6 10 14 18 22 26 30 2 4 7 11 15 19 23 27 31 34 5 8 12 16 20 24 28 32 35 37 9 13 17 21 25 29 33 36 38 39

Решение задачи: «Массив: Змейка, Спираль»

textual
Листинг программы
uses crt;
var a:array[1..9,1..9]of byte;//раз по 3 символа под число, значит максимально
    n,m,x,y,k,z:integer;      //числа двухзначные, до 81
begin
clrscr;
repeat
write('Введите n от 1 до 4 n=');
readln(n);
until n in [1..4];
m:=2*n+1;
x:=n+1;
y:=n+1;
k:=0;
for z:=1 to m*m do
 begin
  a[x,y]:=z-1;
  case k mod 4 of
  0:begin
    dec(x); //вверх
    if m-x=y then inc(k);//поворот
    end;
  1:begin
    dec(y);//влево
    if x=y then inc(k);//поворот
    end;
  2:begin
    inc(x);//вниз
    if m-x+1=y then inc (k);//поворот
    end;
  3:begin
    inc(y); //вправо
    if y=x then inc(k);//поворот
    end;
  end;
 end;
for x:=1 to m do
  begin
    for y:=1 to m do
    write(a[x,y]:3);
    writeln;
  end;
readln
end.

Объяснение кода листинга программы

  1. Объявлены переменные: a, n, m, x, y, k, z (тип: integer)
  2. Цикл repeat предназначен для повторного выполнения кода, пока пользователь не введет корректное значение n.
  3. Значение переменной n ограничивается диапазоном от 1 до 4.
  4. Значение переменной m вычисляется как 2*n+1.
  5. Значения переменных x и y инициализируются как n+1.
  6. Значение переменной k инициализируется как 0.
  7. Для каждого значения z от 1 до m*m выполняется следующая операция: a[x,y] присваивается значение z-1.
  8. Используется конструкция case для определения направления движения.
  9. Если значение k mod 4 равно 0, то выполняется движение вверх (декремент x).
  10. Если значение k mod 4 равно 1, то выполняется движение влево (декремент y).
  11. Если значение k mod 4 равно 2, то выполняется движение вниз (инкремент x).
  12. Если значение k mod 4 равно 3, то выполняется движение вправо (инкремент y).
  13. Если выполняется условие поворота (x=y или y=m), то значение k инкрементируется.
  14. Выполняется цикл for для вывода значений массива a в формате 3 символа.
  15. Цикл for завершается, когда значение x становится равным 0.
  16. Запроса на ввод нет, код завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы