我目前正在研究一個應該解決3D拼圖的算法。 但是我遇到了一個問題,我使用的算法是第一個搜索深度,它似乎運行良好,直到我「獲得STORAGE_ERROR:EXCEPTION_STACK_OVERFLOW」。我不太確定它爲什麼不起作用。任何猜測爲什麼這不起作用?存儲錯誤 - 第一個深度搜索算法
我想要這個算法: 它需要一個List,一個圖形和一個目標。對於這個例子,列表是7部分長。它試圖在第一個座標中輸入該部分。如果它不適合,它會旋轉直到它合適,然後與其餘的(6部分)一起自我調用。如果零件以24種方式旋轉(所有可能的方式旋轉一個3D零件),然後它移動到另一個座標,然後重新開始嘗試擬合。當所有部分都沒有了或沒有任何工作時,它應該退出,並且我有另一個算法在同一個列表中發送另一個訂單到這個算法中。
我還希望算法看看最後的座標是否與目標不匹配,那麼它應該只是回溯並嘗試找到另一個解決方案。
下面是一些代碼:
procedure Pseudo(Parts : in out List_Type; Figure : in out Figure_Type; Goal : in out Figure_Type; LastCoord : in out Integer) is
Unchanged : Part_Type := Parts.Data;
Next : boolean := False;
UnchangedFigure : Figure_Type;
begin
UnchangedFigure := Figure;
if Empty(Parts) then
raise Finished;
else
for I in 1..24 loop
RotNumber(Parts.Data,I); -- rotera
if Check(Parts.Data,Figure) then -- test om den platsar
Maincheck(Parts.Data,Figure,Goal,Next);
if Next then
Unchanged := Parts.Data;
Append_Part(Parts.Data,Figure);
Remove_First(Parts);
Next := False;
Pseudo(Parts,Figure,Goal,LastCoord);
Next := False;
Figure := UnchangedFigure;
Insert_First(Unchanged,Parts);
Figure.CoordX := 0;
Figure.CoordY := 0;
Figure.CoordZ := 0;
end if;
end if;
Parts.Data := Unchanged;
end loop;
end if;
-- if LastCoord /= 7 then --(Original
-- if To_String(Figure.Data)(LastCoord) /= To_String(Goal.Data)(LastCoord) then
-- Put("over");
-- return;
-- end if;
-- end if;
LastCoord := Figure.CoordZ*Figure.X*Figure.Y + (Figure.Y-Figure.CoordY-1)*(Figure.X) + Figure.CoordX +1;
if Figure.CoordY < Figure.Y-1 then
Figure.CoordY := Figure.CoordY +1;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordY = Figure.Y-1 then
if Figure.CoordX < Figure.X-1 then
Figure.CoordX := Figure.CoordX +1;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordX = Figure.X-1 then
if Figure.CoordZ < Figure.Z-1 then
Figure.CoordZ := Figure.CoordZ +1;
Figure.CoordX := 0;
Figure.CoordY := 0;
Pseudo(Parts,Figure,Goal,LastCoord);
elsif Figure.CoordZ = Figure.Z-1 then
return;
end if;
end if;
end if;
end Pseudo;
就在我頭頂,我建議你確認你的遞歸正常結束。失控遞歸是一種簡單易行的方法,可以打擊堆棧並引發Storage_Error。 – 2013-03-25 15:32:54
你好,我認爲你是對的,它可能是一個無限遞歸的地方。但是,由於可能的「分支」數量過多,我仍然不確定它是否按預期工作。 – user2207734 2013-03-25 16:17:21
@ user2207734,你需要檢查你分支的方式,然後 – Alexander 2013-03-25 16:26:10