Заполнить двумерный массив размерностью NxN (N нечетное число) целыми числами от 1 до N*N по следующим правилам:
a) единица помещается в среднюю клетку первой строки;
b) заполнение массива происходит по диагоналям вправо и вверх;
c) при достижении верхней строки следующее число помещается в нижнюю строку так, как будто она находится над верхней строкой;
d) при достижении крайнего правого столбца следующее число помещается в крайний левый столбец так, как будто он находится около крайнего правого столбца;
e) при достижении верхней клетки крайнего правого столбца следует опуститься на одну строку ниже в вертикальном порядке и продолжать заполнение клеток по правилу;
f) если клетка уже заполнена, следует опуститься на одну строку ниже в вертикальном порядке и продолжать заполнение клеток по правилу.
Ответы
Ответ дал:
0
Это алгоритм построения магического квадрата нечетного порядка ![m=1,3,5, ... , 2n-1, , n in mathbb N m=1,3,5, ... , 2n-1, , n in mathbb N](https://tex.z-dn.net/?f=m%3D1%2C3%2C5%2C+...+%2C+2n-1%2C+%2C+n+in+mathbb+N+)
Магическая константа (сумма числе по строке, столбцу или диагоналям) может быть найдена по формуле Баше де Мезириака:
![M= m times frac{m^2+1}{2} M= m times frac{m^2+1}{2}](https://tex.z-dn.net/?f=M%3D+m+times+frac%7Bm%5E2%2B1%7D%7B2%7D+)
Ниже приведена программа на языке 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] <> 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 < 3 then writeln('Ошибка: число должно быть не меньше трех.')
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
Магическая константа (сумма числе по строке, столбцу или диагоналям) может быть найдена по формуле Баше де Мезириака:
Ниже приведена программа на языке 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] <> 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 < 3 then writeln('Ошибка: число должно быть не меньше трех.')
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
Вас заинтересует
1 год назад
6 лет назад
9 лет назад
9 лет назад