仕事
ブール行列を指定して、各列にTrueが1つだけある行の1つ(またはオプションで複数)のサブセットを見つけます。任意のアルゴリズムを使用できますが、前の例のように非常に大きな行列をサポートする必要があります。
可能なアルゴリズムの1つ(KnuthのアルゴリズムX)
このアルゴリズムを使用する必要はありませんが、これが最善のオプションになる場合があります。
- 行列Aに列がない場合、現在の部分解は有効な解です。正常に終了します。
- それ以外の場合は、列cを選択します。
- A r、c = 1となるような行rを選択します。
- 行rを部分解に含めます。
- 各列のためのJようにAのR、J = 1、
行ごとにIようにA 、I、J = 1、
削除行I行列からA。行列Aから
列jを削除します。 - 削減された行列Aに対してこのアルゴリズムを再帰的に繰り返します。
*ステップ3は非決定的であり、後でステップ3を呼び出して行を見つけられなかった場合に、バックトラックする必要があります。
入力
最小の2×2行列Aの任意の表現、たとえば数値またはブール配列
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
またはユニバース+セットコレクションとして
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]
}
または0または1のインデックス付きセット。
{{1, 4, 7}, {1, 4}, {4, 5, 7}, {3, 5, 6}, {2, 3, 6, 7}, {2, 7}}
。
出力
選択された行の数値またはブール配列など、1つ(またはオプションで複数/すべて)の解の任意の表現
1 0 0 1 0 0 0
0 0 1 0 1 1 0
0 1 0 0 0 0 1
または、選択された行を示すブールリスト、{0, 1, 0, 1, 0, 1}
または選択された行の数値(0または1インデックス付き)リスト、{2, 4, 6}
またはセット名のリストとして['B', 'D', 'F']
。
その他の例
に:
1 0 1
0 1 1
0 1 0
1 1 1
Out: 1 3
または4
or 1 0 1 0
または0 0 0 1
or [[1,3],[4]
など。
に:
1 0 1 0 1
0 1 0 1 0
1 1 0 0 1
0 1 0 1 1
アウト: 1 1 0 0
など
に:
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
アウト: 0 0 0 1 1
など
に:
0 1 1
1 1 0
Out:何もないか、エラーまたは不完全なソリューション。つまり、ソリューションなしで入力を処理する必要はありません。
に: http : //pastebin.com/raw/3GAup0fr
アウト: 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
に: https : //gist.github.com/angs/e24ac11a7d7c63d267a2279d416bc694
アウト: 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