Я реализую решатель судоку, используя поиск с возвратом. Он читает доску судоку в виде:
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, но на самом деле это не имеет значения, так как теперь я хочу понять суть этой формулы.
(i / 27)
иint((i % 9) / 3)
делят поле на три горизонтальные и три вертикальные полосы, которые затем объединяются/пересекаются с помощьюa+3*b
в сетку 3x3. - person wildplasser   schedule 01.06.2013