1

我已经阅读了很多关于“精确覆盖”问题和 Knuth 使用重链表的解决方案的内容。我想我理解了其中的 70%,但仍然对链表“cover”和“uncover”应该如何工作感到困惑。

Knuth 的论文:https ://www.ocf.berkeley.edu/~jchu/publicportal/sudoku/0011047.pdf

我理解/已经编码的内容:

  • 72 位宽。12 列用于该片的列中具有 1 位的片,然后 60 列 1 和(大部分)0 代表片的形状。所以 72 位宽(作为单个 Python int)乘 1,928 行(每块对每个正方形的每一次有效移动)

  • 所有带 0 的节点都已被删除,剩余的链接指针已调整

  • 完全链表,每个 Knuth。我的数据结构看起来就像 Knuth 论文第 5 页上的那样:我有常规数据节点、列标题节点、主“h”节点,并且所有内容都是交叉链接的,左/右,上/下等,所以我完成了稀疏矩阵双向链表,左/右和上/下。

  • 对于节点,我编写了删除节点并添加回一个节点。

我被困在哪里:

  • 当他们说要“覆盖”一个专栏时,我有点困惑。我是否从列标题节点列表中仅删除(取消链接)该列的列标题节点?还是我删除该列中的所有节点?

  • 我对行更困惑。当他们说“覆盖一行”时,我不确定要对我的数据结构进行哪些更改。没有像列那样调整“行”标题,我很确定这不是遗漏。没有任何“行标题”,只有列标题。所以如果我想暂时删除一行,我应该改变什么?我是否循环遍历该行中的所有节点并将它们全部删除?如果我回溯,然后将它们全部添加回来?似乎有很多要删除和添加的内容,所以我很确定这是我不理解的部分。

很高兴回答/编辑以使问题更清楚。由于我的代码很长而且很乱,我现在不打算发布它(除非人们真的认为它会有所帮助,但它是链表,就像 Knuth 展示的那样,所以我认为代码会分散注意力。

那么,在使用 Knuth 的链表(带有列标题)时,如何“覆盖”一列,更重要的是,如何“覆盖”一个 ROW?

谢谢,马克

4

1 回答 1

1

当他们说要“覆盖”一个专栏时,我有点困惑。我是否从列标题节点列表中仅删除(取消链接)该列的列标题节点?还是我删除该列中的所有节点?

后者——每一列必须恰好有一个属于精确覆盖的事件行,因此这些节点不能在当前子树中使用。

我对行更困惑。当他们说“覆盖一排”时

我在 Knuth 的文章中找不到该文本。大概意思是,当您通过选择要添加到封面的行来下降解决方案树时,您需要覆盖其所有事件列。

也许更简洁的说法是,当您选择一行时,您需要删除与关联矩阵相对应的二分图中距离为 2 的所有其他行。

于 2020-06-30T22:57:18.000 回答