【发布时间】:2014-07-30 23:38:16
【问题描述】:
当我阅读有关 Knuth 的算法 X 以解决确切的覆盖问题时,我想到了一个需要澄清的极端情况。
这是我的假设:
- 给定一个矩阵 A,算法 X 的“目标是选择行的一个子集,以便数字 1 在每一列中恰好出现一次。”
- 如果矩阵为空,则算法成功终止,然后解决方案是在该点之前记录在部分解决方案中的行的子集。
- 如果有一列是 0,算法将失败终止。
供参考:http://en.wikipedia.org/wiki/Algorithm_X
考虑矩阵 A: [[1 1 0] [0 1 1]]
我采取的步骤:
给定矩阵 A:
1. Choose a column, c, with the least number of 1's. I choose: column 1
2. Choose a row, r, that contains to a 1 in column c. I choose: row 1
3. Add r to the partial solution.
4. For each column j such that A(r, j) = 1:
For each row i such that A(i, j) = 1:
delete row i
delete column j
5. Matrix A is empty. Algorithm terminates successfully and solution is allegedly: {row 1}.
但是,这显然不是这种情况,因为第 1 行仅包含 [1 1 0] 并且显然不包含第 3 列。
我会假设算法应该在某个时候将矩阵减少到只有一个 0 并且终止失败的程度。
有人可以解释一下吗?
【问题讨论】:
-
您考虑过使用最大流量吗?例如对于每一列都有一个节点,其容量为 1 的边缘通向接收器。
-
我没有考虑最大流量,因为我只是特别关注这个算法。更具体地说,我想将此算法应用于数独游戏,这种方法是更广为人知/最佳解决方案之一。谢谢你的建议。
标签: algorithm matrix linear-algebra sudoku