Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: 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 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.045 c
2-1174045916
Kolan
2007-03-16 14:51
2007.04.08
А AV в модуле rtl100.bpl что значит ? Дубль два.


2-1174310576
Степан
2007-03-19 16:22
2007.04.08
nil после Destroy


1-1171091588
blackdak
2007-02-10 10:13
2007.04.08
запуск приложения


1-1171151514
Легалайз
2007-02-11 02:51
2007.04.08
Дельфи не ловит access violation


15-1174033221
Gerew
2007-03-16 11:20
2007.04.08
Пожалуйста, помогите найти ошибку!