数独盒子指数开始位置

时间:2013-06-01 12:34:21

标签: algorithm language-agnostic sudoku

我正在使用回溯实现数独求解器。它以以下形式读取数独板:

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,但它确实没关系,因为现在我想得到那个公式的要点。

2 个答案:

答案 0 :(得分:2)

index表示您的列表中的索引。 blockRowblockColblockIndex引用块开始的行/列/索引。所有除法都是整数除法(向下舍入到下一个整数)。

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))

是标准数独板(测试)的每个扇区的索引。