Заполнить двумерный массив размерностью NxN (N нечетное число) целыми числами от

Заполнить двумерный массив размерностью NxN (N нечетное число) целыми числами от 1 до N*N по последующим правилам:
a) единица вмещается в среднюю клеточку первой строчки;
b) заполнение массива происходит по диагоналям на право и ввысь;
c) при достижении верхней строки следующее число вмещается в нижнюю строчку так, как словно она находится над верхней строчкой;
d) при достижении крайнего правого столбца следующее число помещается в последний левый столбец так, как будто он находится около крайнего правого столбца;
e) при достижении верхней клеточки крайнего правого столбца следует опуститься на одну строчку ниже в вертикальном порядке и продолжать заполнение клеток по правилу;
f) если клеточка теснее заполнена, следует опуститься на одну строчку ниже в вертикальном порядке и продолжать наполнение клеток по правилу.

Задать свой вопрос
1 ответ
Это метод построения волшебного квадрата нечетного порядка m=1,3,5, ... \, 2n-1, \, n \in \mathbb N
Волшебная константа (сумма числе по строке, столбцу либо диагоналям) может быть найдена по формуле Баше де Мезириака:
M= m \times \fracm^2+12

Ниже приведена программа на языке Pascal.ABC.

const
  k = 29;

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

procedure rule_f;
begin
  if (i = 0) and (j = n + 1) then begin
    i := 2;
    j := n
  end
  else begin
    if i = 0 then i := n;
    if j = n + 1 then j := 1
  end;
  if a[i, j] lt;gt; 0 then
  begin
    i := i + 2;
    j := j - 1;
    rule_f
  end
  else
    a[i, j] := m
end;

procedure rule_b;
begin
  i := i - 1;
  j := j + 1
end;

begin
  write('Введите целое нечетное число не меньше, чем 3: ');
  readln(n);
  if (n mod 2) = 0 then writeln('Ошибка: Вы ввели четное число.')
  else if n lt; 3 then writeln('Ошибка: число обязано быть не меньше 3-х.')
  else
  begin
    for i := 1 to n do
      for j := 1 to n do
        a[j, j] := 0;
    i := 1;
    j := (n + 1) div 2;
    a[i, j] := 1;
    for m := 2 to sqr(n) do
    begin
      rule_b;
      rule_f
    end;
    writeln('Волшебный квадрат порядка ', n, ' с магической константой ',
      (n * (sqr(n) + 1)) div 2);
    for i := 1 to n do
    begin
      for j := 1 to n do write(a[i, j]:4);
      writeln
    end
  end
end.

Тестовое решение:

Введите целое нечетное число не меньше, чем 3: 5
Магический квадрат порядка 5 с магической константой 65
  17  24   1   8  15
  23   5   7  14  16
   4   6  13  20  22
  10  12  19  21   3
  11  18  25   2   9


, оставишь ответ?
Имя:*
E-Mail:


Добро пожаловать!

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

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт