Tugas
Diberikan matriks Boolean, cari satu (atau lebih opsional) subset dari baris yang memiliki tepat satu True di setiap kolom. Anda dapat menggunakan algoritma apa pun , tetapi harus mendukung matriks yang sangat besar, seperti contoh terakhir.
Satu algoritma yang mungkin ( Knuth's Algorithm X )
Meskipun tidak ada persyaratan untuk menggunakan algoritma ini, ini mungkin merupakan pilihan terbaik Anda.
- Jika matriks A tidak memiliki kolom, solusi parsial saat ini adalah solusi yang valid; berakhir dengan sukses.
- Kalau tidak pilih kolom c .
- Pilih * baris r sedemikian sehingga A r , c = 1.
- Sertakan baris r dalam solusi parsial.
- Untuk setiap kolom j sehingga A r , j = 1,
untuk setiap baris i yang A i , j = 1,
hapus baris i dari matriks A .
delete kolom j dari matriks A . - Ulangi algoritma ini secara rekursif pada berkurang matriks A .
* Langkah 3 adalah non-deterministik, dan perlu ditinjau kembali dalam kasus kegagalan untuk menemukan baris dalam permohonan selanjutnya dari langkah 3.
Memasukkan
Representasi apa pun yang diinginkan dari matriks minimal 2 × 2 A , misalnya sebagai array numerik atau Boolean
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
atau sebagai koleksi Universe + Set
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]
}
atau sebagai 0 atau 1 set yang diindeks;
{{1, 4, 7}, {1, 4}, {4, 5, 7}, {3, 5, 6}, {2, 3, 6, 7}, {2, 7}}
.
Keluaran
Representasi yang diinginkan dari satu (atau secara opsional lebih / semua) dari solusi, misalnya sebagai array numerik atau Boolean dari baris yang dipilih
1 0 0 1 0 0 0
0 0 1 0 1 1 0
0 1 0 0 0 0 1
atau sebagai daftar Boolean yang menunjukkan baris yang dipilih {0, 1, 0, 1, 0, 1}
atau sebagai daftar numerik (0 atau 1 diindeks) dari baris yang dipilih {2, 4, 6}
atau sebagai daftar nama yang ditetapkan ['B', 'D', 'F']
.
Lebih banyak contoh
Di:
1 0 1
0 1 1
0 1 0
1 1 1
Out: 1 3
atau 4
atau 1 0 1 0
atau 0 0 0 1
atau [[1,3],[4]
dll
Di:
1 0 1 0 1
0 1 0 1 0
1 1 0 0 1
0 1 0 1 1
Keluar: 1 1 0 0
dll
Di:
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
Keluar: 0 0 0 1 1
dll
Di:
0 1 1
1 1 0
Keluar: Tidak ada atau kesalahan atau solusi yang salah, yaitu Anda tidak harus menangani input tanpa solusi.
Di: http://pastebin.com/raw/3GAup0fr
Di luar: 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
Di: https://gist.github.com/angs/e24ac11a7d7c63d267a2279d416bc694
Di luar: 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