我目前正在研究一种应该解决 3D 难题的算法。但是我遇到了一个问题,我使用的算法是第一搜索深度,它似乎运行良好,直到我得到“引发 STORAGE_ERROR:EXCEPTION_STACK_OVERFLOW”。我不太确定为什么它不起作用。任何猜测为什么这不起作用?
我希望这个算法做什么:它需要一个列表、一个数字和一个目标。对于此示例,列表长 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;