Einzelnen Beitrag anzeigen

endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#1

Kreuzworträtsel und Rekursion

  Alt 22. Jul 2005, 12:37
Hallo,

ich arbeite seit gestern an einem Tool das Kreuzworträtsel dekodieren soll.
Angefangen habe ich ersteinmal mit einem Feld von 5 x 5 Buchstaben um es überschaubar zu halten.
In diesem Feld sind wahlos Buchstaben verteilt die es gilt zu sinnvollen Wörtern zu verbinden.
Um das Ganze noch unnötig schwierig zu gestalten sind Verbindungen sowohl horizontal, vertikal
als auch diagonal möglich und das von jedem Buchstaben aus.

Um einen Einstieg zu finden habe ich mit dem Buchstaben in der Mitte angefangen.
Nun hab ich mir also gedachte sammel ich alle möglichen und gültigen Buchstabenkombinationen
und gleiche diese dann anschließend mit der Wortliste ab.

Nun stehe ich aber vor dem Problem das ich nicht weiß welche Felder schon verbunden wurden
und welche noch ausstehen - letztendlich fehlen nämlich immer wieder Kombinationen.

Hier mal ein klein wenig Code:

PlayField ist ein Array in der Größe 5x5
und kann jederzeit erneuert werden.

Delphi-Quellcode:
procedure Find(X, Y: Integer);
var ActualChar: String; loop: Integer;
begin
  ActualChar:= PlayField[X, Y];

  if ActualChar= '#then
    exit;

  Tracker:= Tracker+ActualChar;

  { Look left }
  if (X > 0) then
  begin
    PlayField[X, Y]:= '#';
    Find(X - 1, Y);
  end
  else

  { Look left up }
  if (X > 0) and (Y > 0) then
  begin
    PlayField[X, Y]:= '#';
    Find(X - 1, Y - 1);
  end
  else

  { Look up }
  if (Y > 0) then
  begin
    PlayField[X, Y]:= '#';
    Find(X, Y - 1);
  end
  else

  { Look right up}
  if (X < 4) and (Y > 0) then
  begin
    PlayField[X, Y]:= '#';
    Find(X + 1, Y - 1);
  end
  else

  { Look right }
  if (X < 4) then
  begin
    PlayField[X, Y]:= '#';
    Find(X + 1, Y);
  end
  else

  { Look right down}
  if (X < 4) and (Y < 4) then
  begin
    PlayField[X, Y]:= '#';
    Find(X + 1, Y + 1);
  end
  else

  { Look down }
  if (Y < 4) then
  begin
    PlayField[X, Y]:= '#';
    Find(X, Y + 1);
  end
  else

  { Look left down}
  if (X > 0) and (Y < 4) then
  begin
    PlayField[X, Y]:= '#';
    Find(X - 1, Y - 1);
  end;
end;
Wenn ich nun alles mit dem String '#' zupflaster dann wird
die Rekursion frühzeitig abgebrochen und es fehlen eine
Vielzahl von Möglichkeiten - z.B. wenn sich die Wörter
durch das ganze Feld schlängeln.

Wenn ich die 'else' Bedingung entferne dann entstehen
Kombinationen die nicht erlaubt sind, soll heißen
das Buchstaben an den String Tracker gehängt werden
die nicht an die aktuellen Koordinaten grenzen.

Momentan bin ich ein wenig ratlos wie ich an das Problem rangehen soll.
Hat Jemand vielleicht einen besseren Lösungsansatz?


MfG
  Mit Zitat antworten Zitat