Доброго суток дня.. Сразу перейду к делу.. Вот класс и его описание: | Код | TKoordinata = class // Создем тип класса TKoordinata private koordX, koordY: integer; public constructor Create(const kX, kY: integer); procedure Link(const link: integer); // Процедура поиска соседа ячейки end; //***** Процедура поиска соседа ячейки ***** procedure TKoordinata.Link(const link: integer); begin case link of 1: begin // лево koordX:= koordX - 1; koordY:= koordY; end; 2: begin // верх koordX:= koordX ; koordY:= koordY - 1; end; 3: begin // право koordX:= koordX + 1; koordY:= koordY; end; 4: begin // низ koordX:= koordX; koordY:= koordY + 1; end; end; end;
//***** Конструктор класса TKoordinata ***** constructor TKoordinata.Create(const kX, kY: integer); begin koordX:= kX; koordY:= kY; end;
|
Моя задача написать алгоритм поиска в ширину предмета в лабиринте.. Вот основной код с которым проблема:
| Код | begin pnt:= TKoordinata.Create(startX, startY); open:= TList.Create; closed:= TList.Create; open.Add(pnt); while (open.Count <> 0) do begin pnt:= open[0]; closed.Add(pnt); if (mas[pnt.koordX,pnt.koordY] = 3) then break; for i:= 1 to 4 do begin npnt:= TKoordinata.Create(pnt.koordX, pnt.koordY); // вот в этой строке поллюбому ошибка npnt.Link(i); // посмотрите пожалуйста как ее можно решить inc(tr); memo1.Lines.Add(IntToStr(tr) + ' checking.. ' + ' mas=' + IntToStr(mas[npnt.koordX, npnt.koordY])); //trace if ((open.IndexOf(npnt)=-1) and(closed.IndexOf(npnt)=-1) // тут идет проверка не выходит ли and (npnt.koordX>=0) and (npnt.koordX<=n) // поиск за стенки лабиринта, а так же and (npnt.koordY>=0) and (npnt.koordY<=n) // проверка на посещаемость и and (mas[npnt.koordX, npnt.koordY]<>1) and (mas[npnt.koordX, npnt.koordY]<>2) and (mas[npnt.koordX, npnt.koordY]<>3)) then begin mas[npnt.koordX, npnt.koordY]:= 4; open.Add(npnt); end; end; open.Delete(0); end; end;
|
Помойму слишком много раз создается класс и идет перезаполнение памяти.. Помогите решить проблему пожалуйста |