Вниз
Скачать: CL | DM;

Алгоритм   Найти похожие ветки 

 
User_OKA   (2007-03-21 08:36) [0]

Нужен алгоритм обхода матрицы с центра по часовой стрелке.


 
MBo ©   (2007-03-21 08:51) [1]

массив смещений по x и по y ((1,0)(0,1)(-1,0)(0,-1))
один шаг с первыми смещениями, один со вторыми
два с третьими, два с четвертыми
три с первыми... и т.д.


 
Romkin ©   (2007-03-21 11:29) [2]

Есть только обход с периферии :) Точнее, два :)
type
 TMatrix = array of array of integer;
 TVector = array of integer;

function GetSpiralLeftRight(M: TMatrix): TVector; //Разложение по спирали
var
i, j, k: integer;
Lowi, Hii, Lowj, Hij: integer;
begin
 Result := nil;
 if Length(M) = 0 then
   exit;
 SetLength(Result, Length(M)*Length(M[0]));
 Lowi := 0;
 Lowj := 0;
 Hii := High(M);
 Hij := High(M[0]);
 k := 0;
 while (Lowi <= Hii) or (Lowj <= Hij) do
 begin
   //строка
   for j := Lowj to Hij do
   begin
     Result[k] := M[Lowi, j];
     inc(k);
   end;
   inc(Lowi);
   //столбец
   for i := Lowi to Hii do
   begin
     Result[k] := M[i, Hij];
     inc(k);
   end;
   dec(Hij);
   //обратно строка
   for j := Hij downto Lowj do
   begin
     Result[k] := M[Hii, j];
     inc(k);
   end;
   dec(Hii);
   //Обратно столбец
   for i := Hii downto Lowi do
   begin
     Result[k] := M[i, Lowj];
     inc(k);
   end;
   inc(Lowj);
 end;
end;

function GetSpiralUpDown(M: TMatrix): TVector; //Разложение по спирали
var
i, j, k: integer;
Lowi, Hii, Lowj, Hij: integer;
begin
 Result := nil;
 if Length(M) = 0 then
   exit;
 SetLength(Result, Length(M)*Length(M[0]));
 Lowi := 0;
 Lowj := 0;
 Hii := High(M);
 Hij := High(M[0]);
 k := 0;
 while (Lowi <= Hii) or (Lowj <= Hij) do
 begin
   //столбец
   for i := Lowi to Hii do
   begin
     Result[k] := M[i, Lowj];
     inc(k);
   end;
   inc(Lowj);
   //строка
   for j := Lowj to Hij do
   begin
     Result[k] := M[Hii, j];
     inc(k);
   end;
   dec(Hii);
   //Обратно столбец
   for i := Hii downto Lowi do
   begin
     Result[k] := M[i, Hij];
     inc(k);
   end;
   dec(Hij);
   //обратно строка
   for j := Hij downto Lowj do
   begin
     Result[k] := M[Lowi, j];
     inc(k);
   end;
   inc(Lowi);
 end;
end;


 
User_OKA   (2007-03-21 15:22) [3]

Спасибо



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.027 c
2-1174406514
Lexa11_2002
2007-03-20 19:01
2007.04.08
Как в DLL добавить формы


15-1174021713
Tirael
2007-03-16 08:08
2007.04.08
Raid 0


2-1174289320
Нуб
2007-03-19 10:28
2007.04.08
StringGrid


15-1173880195
Донской
2007-03-14 16:49
2007.04.08
Свободное использование Delphi


1-1171135629
чуть помедленнее
2007-02-10 22:27
2007.04.08
TYPE CAST




   Наверх