const mn = 16; var p: Boolean; procedure Swap(var a, b: Integer); var T: Integer; begin T := a; a := b; b := T end; procedure CreateMagic(n: Integer); var i, j, k, s, b, r, m: Integer; a: Array[1.. mn, 1.. mn] Of Integer; begin p := True; if Odd(n) Then begin i := 1; j := Succ(n div 2); for k := 1 To Sqr(n) do begin a[i, j] := k; if k mod n = 0 Then Inc(i) Else begin Dec(i); Inc(j); if i = 0 Then i := n; if j > n Then j := 1 end end; end Else if n mod 4 = 0 Then begin k := 1; for i := 1 To n Do for j := 1 To n Do begin a[i, j] := k; Inc(k) end; j := 2; m := n div 2; for i := 1 To m Do for k := 1 To m Div 2 Do begin if j = Succ(m) Then j := 2 Else if j = (m + 2) Then j := 1; s := Succ(n - i); b := Succ(n - j); Swap(a[i, j], a[s, b]); Swap(a[i, b], a[s, j]); Inc(j, 2) end end Else if n <> 2 Then begin k := 1; for i := 1 To n Do for j := 1 To n Do begin a[i, j] := k; Inc(k) end; r := Pred(n div 2) div 2; m := n div 2; for i := 1 To m Do begin j := i; for k := 1 To r Do begin if j > m Then j := 1; s := Succ(n - i); b := Succ(n - j); Swap(a[i, j], a[s, b]); Swap(a[i, b], a[s, j]); Inc(j) end end; i := 1; for k := 1 To m Do begin if j > m Then j := 1; s := Succ(n - i); Swap(a[i, j], a[s, j]); Inc(i); Inc(j) end; i := 1; j := r + 2; for k := 1 To m Do begin if j > m Then j := 1; b := Succ(n - j); Swap(a[i, j], a[i, b]); Inc(i); Inc(j) end end Else p := False; if p Then begin for i := 1 To n Do begin for j := 1 To n Do Write(a[i, j]: 4); WriteLn end end Else WriteLn( 'do not exists' ) end; var n: Integer; begin WriteLn('n = '); ReadLn(n); CreateMagic(n); end.
class point { int x; int y; public: point(): x(0), y(0) {} void setkoord(int koordx,int koordy) { x = koordx; y = koordy; } int getx()const { return x; } int gety()const { return y; } };
double length(point p1, point p2) { return (sqrt(pow(double(p1.getx()-p2.getx()),2)+pow(double(p1.gety()-p2.gety()),2))); }
const
mn = 16;
var
p: Boolean;
procedure Swap(var a, b: Integer);
var
T: Integer;
begin
T := a; a := b; b := T
end;
procedure CreateMagic(n: Integer);
var
i, j, k, s, b, r, m: Integer;
a: Array[1.. mn, 1.. mn] Of Integer;
begin
p := True;
if Odd(n) Then
begin
i := 1; j := Succ(n div 2);
for k := 1 To Sqr(n) do
begin
a[i, j] := k;
if k mod n = 0 Then Inc(i)
Else
begin
Dec(i); Inc(j);
if i = 0 Then i := n;
if j > n Then j := 1
end
end;
end
Else
if n mod 4 = 0 Then
begin
k := 1;
for i := 1 To n Do
for j := 1 To n Do
begin
a[i, j] := k; Inc(k)
end;
j := 2; m := n div 2;
for i := 1 To m Do
for k := 1 To m Div 2 Do
begin
if j = Succ(m) Then j := 2
Else
if j = (m + 2) Then j := 1;
s := Succ(n - i); b := Succ(n - j);
Swap(a[i, j], a[s, b]);
Swap(a[i, b], a[s, j]);
Inc(j, 2)
end
end
Else
if n <> 2 Then
begin
k := 1;
for i := 1 To n Do
for j := 1 To n Do
begin
a[i, j] := k; Inc(k)
end;
r := Pred(n div 2) div 2; m := n div 2;
for i := 1 To m Do
begin
j := i;
for k := 1 To r Do
begin
if j > m Then j := 1;
s := Succ(n - i); b := Succ(n - j);
Swap(a[i, j], a[s, b]);
Swap(a[i, b], a[s, j]);
Inc(j)
end
end;
i := 1;
for k := 1 To m Do
begin
if j > m Then j := 1;
s := Succ(n - i);
Swap(a[i, j], a[s, j]);
Inc(i); Inc(j)
end;
i := 1; j := r + 2;
for k := 1 To m Do
begin
if j > m Then j := 1;
b := Succ(n - j);
Swap(a[i, j], a[i, b]);
Inc(i); Inc(j)
end
end
Else p := False;
if p Then
begin
for i := 1 To n Do
begin
for j := 1 To n Do
Write(a[i, j]: 4);
WriteLn
end
end
Else
WriteLn( 'do not exists' )
end;
var
n: Integer;
begin
WriteLn('n = '); ReadLn(n);
CreateMagic(n);
end.