Ein direkter Weg ist eine rekursive Prozedur, die bei jedem Aufruf Folgendes ausführt. Die Eingabe für die Prozedur ist eine Liste von Paaren, die bereits ausgewählt wurden, und eine Liste aller Paare.
- Berechnen Sie die kleinste Zahl, die noch nicht in der Eingabeliste enthalten ist. Für den ersten Aufruf ist dies natürlich 0, da keine Paare ausgewählt wurden.
- Wenn alle Zahlen abgedeckt sind, haben Sie eine korrekte Kombination. Drucken Sie sie aus und wiederholen Sie den vorherigen Schritt. Ansonsten ist die kleinste Zahl, die aufgedeckt wird, das Ziel, das wir anstreben werden.
- Durchsuchen Sie die Paare nach einer Möglichkeit, die Zielnummer zu erfassen. Wenn es keine gibt, kehren Sie einfach zur vorherigen Rekursionsebene zurück.
- Wenn es eine Möglichkeit gibt, die Zielnummer abzudecken, wählen Sie den ersten Weg und rufen Sie die gesamte Prozedur rekursiv erneut auf, wobei das gerade ausgewählte Paar zur Liste der ausgewählten Paare hinzugefügt wird.
- Suchen Sie nach dem nächsten Weg, um die Zielnummer mit einem Paar zu überdecken, ohne ein zuvor ausgewähltes Paar zu überlappen. Wenn Sie eine finden, wählen Sie sie aus und rufen Sie die nächste Prozedur erneut rekursiv auf.
- Fahren Sie mit den Schritten 4 und 5 fort, bis die Zielnummer nicht mehr erfasst werden kann. Gehen Sie die gesamte Liste der Paare durch. Wenn die Auswahl nicht mehr korrekt ist, kehren Sie zur vorherigen Ebene der Rekursion zurück.
Die Visualisierung dieses Algorithmus erfolgt mit einem Baum, dessen Pfade Sequenzen nicht überlappender Paare sind. Die erste Ebene des Baums enthält alle Paare, die 0 enthalten. Im obigen Beispiel ist der Baum
Wurzel
|
----------------
| | |
(0,1) (0,2) (0,3)
| | |
(2,3) (1,3) (1,2)
In diesem Beispiel geben alle Pfade durch den Baum tatsächlich korrekte Sammlungen an. Wenn wir jedoch beispielsweise das Paar (1,2) weglassen, hat der Pfad ganz rechts nur einen Knoten und entspricht der Suche in Schritt 3, die fehlschlägt.
Suchalgorithmen dieses Typs können für viele ähnliche Probleme der Aufzählung aller Objekte eines bestimmten Typs entwickelt werden.
Möglicherweise bedeutete das OP, dass sich alle Paare in der Eingabe befanden und nicht nur eine Gruppe von ihnen, wie in der Frage angegeben. In diesem Fall ist der Algorithmus viel einfacher, da nicht mehr überprüft werden muss, welche Paare zulässig sind. Es ist nicht einmal erforderlich, die Menge aller Paare zu generieren. Der folgende Pseudocode erfüllt die Anforderungen des OP. Hier ist die Eingabenummer, "Liste" beginnt als leere Liste, und "verdeckt" ist ein Array mit der Länge auf 0 initialisiert ist. Es könnte etwas effizienter gestaltet werden, aber das ist nicht mein unmittelbares Ziel.nnn
sub cover {
i = 0;
while ( (i < n) && (covered[i] == 1 )) {
i++;
}
if ( i == n ) { print list; return;}
covered[i] = 1;
for ( j = 0; j < n; j++ ) {
if ( covered[j] == 0 ) {
covered[j] = 1;
push list, [i,j];
cover();
pop list;
covered[j] = 0;
}
}
covered[i] = 0;
}