2013-06-01 5 views
0

Я реализую решатель sudoku с использованием backtracking. Она читает судок доску в виде:Начальная позиция ящика коробки Sudoku

027800061000030008910005420500016030000970200070000096700000080006027000030480007

Я знаю, как я могу понять элементы на колонке, делая index % 9 (а затем делает простую арифметическую прогрессию соотношения 9), а также элементы на line, используя 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, но это действительно не имеет значения, так как теперь я хочу получить суть этой формулы.

+1

Используйте бумагу и карандаш. Термины '(i/27)' и 'int ((% 9)/3) делят поле на три горизонтальные и три вертикальные полосы, которые затем объединяются/пересекаются через' a + 3 * b' в 3x3 квадратная сетка. – wildplasser

ответ

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

Извините, некро-шишка, но вот решение кто-то может найти интересное (при условии, вы можете прочитать лепечет, 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)))) 

Аргументы измерения должны быть вектор/список, представляющий a [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)) 

, которые являются показателями каждого сектора стандартной платы Sudoku (проверено).

Смежные вопросы