Sie können das Hauptverfahren rekursiv Rufweiterleitung zu suchen, rückwärts, nach oben, nach unten, links-oben/unten-diagonal und rechts-oben/unten-diagonal.
if (arg[2] == array.length && arg[3] == array.length)
return 0;
if (firstTimeMainFunctionCalled) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
// Only make recursive call when you are
// on the outer edge of the 2D array
if (i == 0 || j == 0) {
main(1, 0, i, j);
main(0, 1, i, j);
main(1, 1, i, j);
main(-1, 0, i, j);
main(0, -1, i, j);
main(-1, -1, i, j);
main(1, -1, i, j);
main(-1, 1, i, j);
}
}
}
int rowInc = arg[0];
int colInc = arg[1];
int curRow = arg[2];
int curCol = arg[3];
int str1Place = 0;
int str2Place = 0;
int str3Place = 0;
while (curRow >= 0 && curCol >= 0 && curRow < array.length && curCol < array[0].length) {
if (array[curRow][curCol] == str1[str1Place])
str1Place++;
else
str1Place = 0;
if (str1Place == str1.length)
// Found str1
// Do the same for str2 and str3
curRow += rowInc;
curCol += colInc;
}
Dies ist eine sehr rohe Lösung und kann eine ganze Menge verbessert werden, haben Sie natürlich in geeigneter Weise die Haupt-Methode aufrufen, indem Sie die Argumente in eine Liste von Strings drehen, aber es sollte man irgendwo anfangen geben. Sie können dies mit dynamischer Programmierung verbessern, Sie können auch eine Rückverfolgung durchführen, um etwas mit der Zeichenfolge zu tun, sobald Sie sie gefunden haben. Wie Sie sehen können, muss die verschachtelte Schleife nicht verschachtelt sein.
Pardon mein Pseudo-Code :)
Es geschieht nicht, dass jede Saite ist wie 3 Zeichen lang gefunden werden? –
Nein, sie sind variabel –
Das ist rückwärts. Wir sollten unseren Schülern beibringen, monolithische Code-Blöcke in Methoden zu zerlegen. –