hubertus1990
Lt. Commander
- Registriert
- Sep. 2005
- Beiträge
- 1.384
Hi Leute.
Habe eine kleine Frage bezüglich Backtracking.
Ich möchte alle möglichen true/false Kombinationen eines boolean Arrays mit 4 Werten mittels Backtracking herausfinden, also zum Beispiel:
TTTT
TTTF
TTFF usw...
leider funktioniert die Sache bei mir nicht so ganz.
Kann mir jemand sagen was ich falsch mache?
"Main" Methode
Die Methode isValid(visitors) macht nichts anderes als zu überprüfen, ob die errechnete Kombination erlaubt ist (Ausgabe erfolgt nur, wenn erlaubt) -> bei mir ist beispielsweise TTFF nicht erlaubt. Sollte aber irrelevant bezüglich der eigentlichen Frage sein.
Rekursive Methode für Backtracking
Habe eine kleine Frage bezüglich Backtracking.
Ich möchte alle möglichen true/false Kombinationen eines boolean Arrays mit 4 Werten mittels Backtracking herausfinden, also zum Beispiel:
TTTT
TTTF
TTFF usw...
leider funktioniert die Sache bei mir nicht so ganz.
Kann mir jemand sagen was ich falsch mache?
"Main" Methode
Code:
boolean[] visitors = new boolean[4] { true, true, true, true }
public void printVariations() {
do {
if (isValid(visitors)) { // check if kombination is allowed
/* print */
StringBuffer a = new StringBuffer();
for(int i = 0; i < visitors.length; i++) {
if(visitors[i] == true) a.append(Person.values()[i] + " ");
}
System.out.println(a.toString());
}
} while (nextState(0) == true); // as long as it is somehow possible, to find a valid way, the loop continues
}
Die Methode isValid(visitors) macht nichts anderes als zu überprüfen, ob die errechnete Kombination erlaubt ist (Ausgabe erfolgt nur, wenn erlaubt) -> bei mir ist beispielsweise TTFF nicht erlaubt. Sollte aber irrelevant bezüglich der eigentlichen Frage sein.
Rekursive Methode für Backtracking
Code:
public boolean nextState(int level) {
System.out.println("try");
if(visitors[level] == true) { // wahl gültig
visitors[level] = false;
if(level >= visitors.length - 1) return true; // vektor vollständig
if(nextState(level + 1) == true) return true;
else visitors[level] = true; // rückgängig machen
}
return false;
}
Zuletzt bearbeitet: