我正在使用回溯实现数独求解器。它以以下形式读取数独板:
027800061000030008910005420500016030000970200070000096700000080006027000030480007
我知道如何通过使用index % 9
(然后执行比率为9的简单算术级数)以及使用index/9
在线上的元素来计算列上的元素(然后通过添加一个直到我得到它们中的每一个),其中index是范围[0,80]中的数字。
如果我在该框中有元素索引,我无法弄清楚如何获取框的起始索引。
所以我用谷歌搜索了我:http://jakevdp.github.io/blog/2013/04/15/code-golf-in-python-sudoku/
这家伙正在这样的方框中获得起始指数:
start = 27 * int(i / 27) + 3 * int((i % 9) / 3)
其中i
是我的元素列表中的索引。
我无法理解他是如何弄清楚这个公式的,我怎么能自己推断出来,所以请向我解释一下。
我理解在这个公式之后出现的列表理解,这一切都没有意义。
PS: 我写这篇文章来学习Haskell,但它确实没关系,因为现在我想得到那个公式的要点。
答案 0 :(得分:2)
index
表示您的列表中的索引。 blockRow
,blockCol
和blockIndex
引用块开始的行/列/索引。所有除法都是整数除法(向下舍入到下一个整数)。
index = row*9 + col
row = index / 9
col = index % 9
blockRow = (row / 3) * 3
blockCol = (col / 3) * 3
blockRow = (index / 9 / 3) * 3 = (index / 27) * 3
blockCol = (index % 9 / 3) * 3
blockIndex = (blockRow*9) + blockCol = ((index / 27) * 3 * 9) + (index % 9 / 3) * 3 =
(index / 27) * 27 + 3 * (index % 9 / 3)
答案 1 :(得分:1)
很抱歉,这可能会让人觉得有趣(如果你能阅读lisps;在这种情况下是Clojure)。它返回数独板的每个“扇区”的索引,并且通常足以用于许多不同的板尺寸。 standard-9-sector-indices
假设电路板分为9个扇区,因此电路板宽度/高度应为3的倍数。get-sector-indices
可用于任何电路板尺寸:
(defn get-sector-indices [board-width sector-top-left-pos sector-dimensions]
(let [[sw sh] sector-dimensions
[tx ty] sector-top-left-pos]
(for [y (range ty (+ ty sh))
x (range tx (+ tx sw))]
(+ x (* y board-width)))))
(defn standard-9-sector-indices [board-dimensions]
(let [[bw bh] board-dimensions
[sw sh :as sd] (map #(/ % 3) board-dimensions)]
(for [y (range 0 bh sh)
x (range 0 bw sw)]
(get-sector-indices bw [x y] sd))))
维度参数应该是表示[x y]
对的向量/列表。
(standard-9-sector-indices [9 9])
返回:
((0 1 2 9 10 11 18 19 20)
(3 4 5 12 13 14 21 22 23)
(6 7 8 15 16 17 24 25 26)
(27 28 29 36 37 38 45 46 47)
(30 31 32 39 40 41 48 49 50)
(33 34 35 42 43 44 51 52 53)
(54 55 56 63 64 65 72 73 74)
(57 58 59 66 67 68 75 76 77)
(60 61 62 69 70 71 78 79 80))
是标准数独板(测试)的每个扇区的索引。