私は現在、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;