40 lines
796 B
Text
40 lines
796 B
Text
spiral(n) := block([a, i, j, k, p, di, dj, vi, vj, imin, imax, jmin, jmax],
|
|
a: zeromatrix(n, n),
|
|
vi: [1, 0, -1, 0],
|
|
vj: [0, 1, 0, -1],
|
|
imin: 0,
|
|
imax: n,
|
|
jmin: 1,
|
|
jmax: n + 1,
|
|
p: 1,
|
|
di: vi[p],
|
|
dj: vj[p],
|
|
i: 1,
|
|
j: 1,
|
|
for k from 1 thru n*n do (
|
|
a[j, i]: k,
|
|
i: i + di,
|
|
j: j + dj,
|
|
if i < imin or i > imax or j < jmin or j > jmax then (
|
|
i: i - di,
|
|
j: j - dj,
|
|
p: mod(p, 4) + 1,
|
|
di: vi[p],
|
|
dj: vj[p],
|
|
i: i + di,
|
|
j: j + dj,
|
|
if p = 1 then imax: imax - 1
|
|
elseif p = 2 then jmax: jmax - 1
|
|
elseif p = 3 then imin: imin + 1
|
|
else jmin: jmin + 1
|
|
)
|
|
),
|
|
a
|
|
)$
|
|
|
|
spiral(5);
|
|
/* matrix([ 1, 2, 3, 4, 5],
|
|
[16, 17, 18, 19, 6],
|
|
[15, 24, 25, 20, 7],
|
|
[14, 23, 22, 21, 8],
|
|
[13, 12, 11, 10, 9]) */
|