Главная страница
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.049 c
1-1171423401
GuV
2007-02-14 06:23
2007.04.08
Создание ComboBox с нуля


15-1173949620
DevilDevil
2007-03-15 12:07
2007.04.08
C++Builder. Реально ли не таскать за собой DLL?


2-1173976988
Malik
2007-03-15 19:43
2007.04.08
Что за Word2000 в uses и где его взять?


6-1161367061
Русло
2006-10-20 21:57
2007.04.08
Как из своего приложения запустить подключение к GPRS


2-1174118100
Boker
2007-03-17 10:55
2007.04.08
TImage - невозможна загрузка ...??