Rekursive Suche nach Wort Algorithmus

Es ist Zeit für mich zu schreiben, dass Ihre Großmutter Ihr erstes Java-Wortsuche-Programm. Aber anstatt Ihr zu tun, die Arbeit suchen Wörter innerhalb der Buchstaben-raster, eine rekursive Funktion 4WaySearch tut es für Sie!

Das problem ist nur:

Ich finde es schwer zu konzipieren ist ein rekursiver Algorithmus, der baut alle möglichen Buchstaben-Kombination beim Start auf einmal Platz in der Startaufstellung.

Hier ist der code, den ich bereits geschrieben habe, dass ich erachten einen großen Schritt in die richtige Richtung:

/* 
* This is the method that calls itself repeatedly to wander it's way
* through the grid using a 4 way pattern,
* creating every possibly letter combination and checking it against a
* dictionary. If the word is found in the dictionary, it gets added to a
* collection of found words.
* 
* Here an example of a 3x3 grid with the valid words of RATZ and BRATZ, but
* the word CATZ isn't valid. (the C is not tangent to the A).
* 
* CXY
* RAT
* BCZ
*
* @param row Current row position of cursor
* @param col Current column position of cursor
*/
private void 4WaySearch(int row, int col) {

    //is cursor outside grid boundaries?
    if (row < 0 || row > ROWS - 1 || col < 0 || col > COLS - 1)
        return; 

    GridEntry<Character> entry = getGridEntry(row, col);

    //has it been visited?
    if (entry.hasBreadCrumb())
        return; 

    //build current word
    currentWord += entry.getElement(); //returns character

    //if dictionay has the word add to found words list
    if (dictionary.contains(currentWord))
        foundWords.add(currentWord);

    //add a mark to know we visited
    entry.toggleCrumb();

    //THIS CANT BE RIGHT
    4WaySearch(row, col + 1);   //check right
    4WaySearch(row + 1, col);   //check bottom
    4WaySearch(row, col - 1);   //check left
    4WaySearch(row - 1, col);   //check top

    //unmark visited
    entry.toggleCrumb();

    //strip last character
    if (currentWord.length() != 0)
        currentWord = currentWord.substring(
        0, 
        (currentWord.length() > 1) ? 
            currentWord.length() - 1 : 
            currentWord.length()
        );
}

In meinem Kopf, ich Stelle mir die search-Algorithmus genauso wie eine rekursive Struktur traveral Algorithmus, aber jeder Knoten (Eintrag in diesem Fall) hat 4 Kinder (Tangens-Werte), und die Endknoten sind die Grenzen des Rasters.

Auch, die Position des Cursors beim ersten Eintritt in die Funktion wird bestimmt durch eine einfache for-Schleife psuedocoded hier:

for (int r = 0; r < ROWS; r++)
  for (int c = 0; r < COLS; c++)
    4WaySearch(r,c);
  end for;
end for;

Denke ich darüber nach dies für eine Weile jetzt, und Sie versuchen, verschiedene Ansätze... aber ich kann immer noch nicht scheinen zu wickeln meinem Kopf herum und machen es zu arbeiten. Kann mir jemand zeigen, das Licht? (Zum Wohle von mir und deiner Großmutter! :D)

  • Ist dies eine Hausaufgaben-Frage?
  • Warum willst du diese rekursiv, Hausaufgaben?
  • Sie sagen CATZ nicht gültig ist, aber warum kann man nicht beginnen mit dem C auf der unteren Reihe? Dann scheint gültig zu sein.
  • Ja, es muss getan werden rekursiv.
  • mein Fehler, zu ignorieren, dass unten C. ersetzen Sie es mit.... O
  • Ja es ist eine Hausaufgabe. Versteh mich nicht falsch... ich möchte nicht, dass jemand den code schreiben, für mich, ich Suche gerade nach einem push in die richtige Richtung.
  • Das erste, was zu beachten ist, dass in einem wordsearch, das Wort hat alles in einer Linie, so dass Sie nicht wollen, um zu überprüfen, alle vier Richtungen, jede Rekursion. Zweitens, wo ist currentWord definiert?
  • Ich denke, es ist mehr wie ein boggle-Typ-Spiel suchen. Wo Sie suchen können in alle 4 Richtungen, aber gerade nicht die gleichen Buchstaben zweimal.
  • Ich sehe. Das macht zumindest mehr Sinn machen, Rekursion zu verwenden, für.
  • Das Wort muss nicht in einer geraden Linie. Solange die einzelnen Buchstaben des Wortes neben einander, es ist gültig. So könnten Sie haben verrückte Schlange-wie der Blick Worte. Und currentWord ist eine Klasse variabel, dies ist nur eine Methode aus der Klasse. Davon, dass alle Erklärungen, Funktionsaufrufe und syntaktische Zeug ist richtig.

InformationsquelleAutor snnth | 2011-10-26
Schreibe einen Kommentar