Aufgabe
Suchen Sie bei einer gegebenen Booleschen Matrix eine (oder optional mehrere) Teilmenge (n) von Zeilen, die in jeder Spalte genau ein True enthalten. Sie können einen beliebigen Algorithmus verwenden , müssen jedoch sehr große Matrizen unterstützen, wie im letzten Beispiel.
Ein möglicher Algorithmus ( Knuths Algorithmus X )
Dieser Algorithmus muss zwar nicht verwendet werden, ist jedoch möglicherweise die beste Option.
- Wenn die Matrix A keine Spalten enthält, ist die aktuelle Teillösung eine gültige Lösung. erfolgreich beenden.
- Andernfalls wählen Sie eine Spalte c .
- Wählen Sie * eine Zeile r so, dass A r , c = 1 ist.
- Fügen Sie die Zeile r in die Teillösung ein.
- Für jede Spalte j , so daß A r , j = 1,
für jede Zeile i , so dass A i , j = 1,
Zeile löschen i von Matrix A .
Spalte j aus Matrix A löschen . - Wiederholen Sie diesen Algorithmus rekursiv auf der reduzierten Matrix A .
* Schritt 3 ist nicht deterministisch und muss zurückverfolgt werden, wenn bei einem späteren Aufruf von Schritt 3 keine Zeile gefunden wird.
Eingang
Beliebige gewünschte Darstellung der minimalen 2 × 2-Matrix A , z. B. als numerisches oder boolesches Array
1 0 0 1 0 0 1
1 0 0 1 0 0 0
0 0 0 1 1 0 1
0 0 1 0 1 1 0
0 1 1 0 0 1 1
0 1 0 0 0 0 1
oder als Universe + Set Sammlung
U = {1, 2, 3, 4, 5, 6, 7}
S = {
A = [1, 4, 7],
B = [1, 4],
C = [4, 5, 7],
D = [3, 5, 6],
E = [2, 3, 6, 7],
F = [2, 7]
}
oder als 0 oder 1 indizierte Mengen;
{{1, 4, 7}, {1, 4}, {4, 5, 7}, {3, 5, 6}, {2, 3, 6, 7}, {2, 7}}
.
Ausgabe
Beliebige gewünschte Darstellung einer (oder optional mehrerer / aller) der Lösungen, z. B. als numerisches oder boolesches Array der ausgewählten Zeilen
1 0 0 1 0 0 0
0 0 1 0 1 1 0
0 1 0 0 0 0 1
oder als Boolesche Liste, die ausgewählte Zeilen angibt, {0, 1, 0, 1, 0, 1}
oder als numerische (0 oder 1 indizierte) Liste ausgewählter Zeilen {2, 4, 6}
oder als Liste von Satznamen ['B', 'D', 'F']
.
Mehr Beispiele
Im:
1 0 1
0 1 1
0 1 0
1 1 1
Out: 1 3
oder 4
oder 1 0 1 0
oder 0 0 0 1
oder [[1,3],[4]
etc.
Im:
1 0 1 0 1
0 1 0 1 0
1 1 0 0 1
0 1 0 1 1
Out: 1 1 0 0
etc.
Im:
0 1 0 1 1 0 1
1 1 0 0 1 1 1
0 1 0 0 1 0 0
1 1 1 0 0 0 1
0 0 0 1 1 1 0
Out: 0 0 0 1 1
etc.
Im:
0 1 1
1 1 0
Out: Nichts oder Fehler oder fehlerhafte Lösung, dh Sie müssen keine Eingaben ohne Lösung verarbeiten.
In: http://pastebin.com/raw/3GAup0fr
Aus: 0 10 18 28 32 38 48 61 62 63 68 86 90 97 103 114 120 136 148 157 162 174 177 185 186 194 209 210 218 221 228 243 252 255 263 270 271 272 273 280 291 294 295 309 310 320 323 327 339 345 350 353 355 367 372 373 375 377 382 385 386 389 397 411 417 418 431 433 441 451 457 458 459 466 473 479 488 491 498 514 517
In: https://gist.github.com/angs/e24ac11a7d7c63d267a2279d416bc694
Aus: 553 2162 2710 5460 7027 9534 10901 12281 12855 13590 14489 16883 19026 19592 19834 22578 25565 27230 28356 29148 29708 30818 31044 34016 34604 36806 36918 39178 43329 43562 45246 46307 47128 47906 48792 50615 51709 53911 55523 57423 59915 61293 62087 62956 64322 65094 65419 68076 70212 70845 71384 74615 76508 78688 79469 80067 81954 82255 84412 85227