fand ich die A*-Algorithm und ich möchte es verwenden, um die optimale Lösung für eine 8-Puzzle zu finden.„Nachbar-Funktion“ Optimierung 8-Puzzle mit A * -Algorithmus zu lösen
wie im Bild das Puzzle wie folgt aussieht:
0 1 2
3 4 5
6 7 8
und ist als eine Anordnung dargestellt ist: 0 1 2 3 4 5 6 7 8
Die "Nachbar-Funktion" gibt alle Nachbarn ein Array-Index. Nachbarn sind alle Zahlen, die ein Feld vertikal oder horizontal vom Array-Index entfernt sind.
Beispiel: Neighbor (4) zurückkehren würde und 1,5,7,3 Nachbar (6) 3,7
Meine aktuelle Lösung (codiert durch Uwe Raabe) zurückkehren würde:
function Neighbours(zahl: Integer): TArray<Integer>;
var
lst: TList<Integer>;
c: Integer;
r: Integer;
begin
lst := TList<Integer>.Create;
try
c := zahl mod 3;
r := zahl div 3;
if r > 0 then
lst.Add(zahl-3);
if c > 0 then
lst.Add(zahl-1);
if c < 2 then
lst.Add(zahl+1);
if r < 2 then
lst.Add(zahl+3);
result := lst.ToArray;
finally
lst.Free;
end;
end;
Ich bin auf der Suche nach einer kompakten und besseren Lösung. Ich würde gerne etwas algorithmisches sehen. Ich mag das if's nicht. Die Programmiersprache ist nicht wirklich wichtig, solange es zu einem von diesen tragbar ist: C/C++/Delphi/C#
Vielen Dank im Voraus!
Wenn die Größe der Matrix konstant ist, verwenden Sie eine Nachschlagetabelle. –
Sie können Tabelle mit fest codierten Werten für solch ein kleines Feld verwenden. – MBo
Ja, aber ich bin daran interessiert, wie man es mit einem Algorithmus macht, aber kompakter. –