Ich habe nur Anregungen gegeben und keinen ganz konkreten Algorithmus vorgeschlagen. Hier muss man natürlich verfeinern, wie die weiterführenden Erläuterungen doch zeigen sollten.
Ok, Tobias will wohl nur trollen, aber falls da jemand über den Thread kommt kann man ganz dumme Fehler direkt aufzeigen:
a) Bei Fehlschlägen muss direkt abbrechen. Also wenn man in den Schleifen 1,1 hat, dann ist der Anfang ungültig … also ist es Quatsch, weiter vor zu gehen.
b) wieso mehrmals so verschachtelte Schleifen? Die 4 verschachtelten Schleifen sind ja in den 5en auch drin. Und diese in den 6 und so weiter … also doch ganz offensichtlich doppelter Code und damit auch doppelte Ausführung ….
c) Man sollte die Größe der Schleifen auch klein halten … eine Schleife über 8 Elemente ist deutlich schneller als über 16 Elemente … daher macht es Sinn, die Richtungen zu nutzen … Der Vorteil ist schnell klar: 8^8 und 16^8 - das macht schon einen deutlichen Unterschied …
Und wenn man sich überlegt, was für Checks man machen muss, dann ist das mit den Richtungen auch deutlich einfacher zu handhaben …
Und dann überlegen wir uns doch mal wirklich, wie wir sowas aufbauen könnten. 4x4 Felder - kann man nummerieren von 0..15 was Hexadezimal wäre … passt gut, denn da haben wir dann 4 Bit und die ersten zwei geben die Reihe und die anderen beiden die Spalte so dass wir schnell umrechnen können.
Datenstrukturen? Man kann sowas in ein Array oder eine Liste schreiben … oder wir nutzen einfach Strings mit Zeichen 0..F
Das kann man mit Schleifen machen, aber Brute Force parallelisiert man am Besten. Schleifen sind da aber eher ungeeignet. Also denken wir das einfach neu. Wir bauen in den Schleifen doch (Teil)Codes auf um diese dann zu erweitern. Und diese fangen am Anfang an mit 0 1 2 … F …
Wenn wir einen Code probieren, nehmen wir so einen Teilcode und schauen, ob wir den erweitern können … dazu prüfen wir die 8 Richtungen …
Haben wir eine Richtung, die geht, dann hängen wir das gefundene Element ab und haben einen neuen Teilcode.
- Hat dieser die notwendige Länge (das war als 4 Zeichen angegeben), dann haben wir einen gültigen Code und den wollten wir zählen.
- Hat dieser noch nicht die maximale Länge, dann haben wir einen Code, den wir weiter verarbeiten müssen.
Also haben wir eine Codeverwaltung als eine Queue welche am Anfang mit 0..F gefüllt wird.
Da können. beliebige Worker sich Elemente entnehmen, um diese zu prüfen:
- das letzte Zeichen des Codes wird genommen um den Platz (Spalte und Reihe) zu ermitteln.
- da können wir dann die 8 Richtungen probieren: Ist das neue Feld ungültig: continue. Ist der Wert schon im String drin: Richtung erneut probieren und neu checken. Haben wir ein gültiges Feld, dann den Wert an den String anhängen. Minimale Länge erfüllt: zählen, keine maximale Länge erreicht: in Queue stecken
So haben wir nur Java Framework verwendet. Eigene Klassen machen aber natürlich Sinn zur Strukturierung des Codes. Und man kann es beliebig ausbauen: Statt nur ein Prozess mit mehreren Threads kann man das sogar in einem hpc Cluster laufen lassen… Oder so ausbauen, dass weltweit alle User mithelfen könnten …
Ist also eigentlich ein einfaches Teile und Herrsche Problem … ok, nicht für jeden …