【发布时间】:2011-01-17 21:41:07
【问题描述】:
我正在尝试编写一个数独求解器,我尝试这样做的方法是使用一个 9x9 的指针网格来保存具有解决方案或有效可能值的“集合”对象的地址。
我能够通过 2 个 for 循环遍历数组,首先遍历每一列,然后转到下一行并重复。
但是,我很难想象如何指定特定单元格属于哪个子网格(或框、块等)。我最初的印象是在 for 循环中有 if 语句,例如 if row
【问题讨论】:
-
如果 (i,j) 是单元格的坐标,则 (i/3,j/3) 是块的坐标。
-
对于数独求解器,您可能需要考虑一下速度,并使用预先计算的查找表。一个包含 81 项的数组来查找一个单元格所在的块将是快速而简单的。不是答案,因为您仍然需要生成该数组,但如果您有足够的耐心,您可以手动将其填充为静态数据块。
-
@Steve314 在考虑速度时,请更喜欢简单的计算而不是查找。完整的内存读取是昂贵的。只有当答案恰好在 L1 缓存中时,查找它的速度可能不会变慢(但它仍然会占用宝贵的 L1 缓存空间)。
-
@Sjoerd - 一个 81 字节的表并不十分庞大,并且考虑到整个算法很短,除了第一次调用之外,无论如何都应该在 L1 缓存中。但是,经过反思,您可能对简单的计算更小是正确的。
标签: c++ multidimensional-array sudoku