Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Итак, задача: разработать алгоритм для вычисления значения элемента спиральной матрицы на основании его координат [i, j] и размера самой матрицы, пользуясь только простыми арифметическими вычислениями. Исключение составляет модуль — абсолютное значение числа.
А матрицу нельзя развернуть, заполнить и закрутить обратно? :)
program tmp;
{Delpi 7}
{$APPTYPE CONSOLE}
uses
SysUtils,System;
var
M : array of array of integer;
N : integer;
i,j,c : integer;
level, start, fin : integer;
v : integer;
stop: integer;
begin
write ('N=?');
readln (N);
SetLength(M,N+1,N+1);
{
//
for i :=1 to N do
for j:= 1 to N do
M[i,j]:= 0;
//
}
v := 0;
start := 0;
fin := N;
i:= 1;
stop := N * N div 2 + N mod 2;
for level:=1 to stop do // main loop
begin
start := start+1;
for c:=start to fin do // from left to right
begin
v := v+1;
M [i,c] := v;
j := c;
end;
start := start+1;
for c:=start to fin do // from top to bot
begin
v := v+1;
M [c,j] := v;
i := c;
end;
start := start-1;
fin := fin-1;
for c:=fin downto start do // from right to left
begin
v := v+1;
M [i,c] := v;
j := c;
end;
for c:=fin downto start+1 do // from bot to top+1
begin
v := v+1;
M [c,j] := v;
i := c;
end;
end; // main loop
// print result
for i :=1 to N do
begin
for j:= 1 to N do
write (M[i,j]:3);
writeln;
end;
writeln ('v=',v,'=N*N');
write ('Press anykey to exit...');
readln;
end.
Альтернативный способ заполнения «спиральной матрицы»