Для базовых классов решателя я вижу хорошее начало с Cell
, ValidationRegion
, Board
и Pattern
в качестве основных классов.
Cell
: содержит текущее значение ячейки, оставшиеся возможные значения ячейки и фиксированная ячейка или нет.
ValidationRegion
: имеет ссылки на соответствующие ячейки.9 Cells
на Board
.Этот класс на самом деле не должен знать, представляет ли он горизонтальные, вертикальные или квадратные области, потому что правила одинаковы.Этот класс имеет метод validate () для проверки возможности текущего состояния региона.
Board
: имеет полный макет Cells
и соответствующим образом инициализирует фиксированный ValidationRegions
, передаваясоответствующий Cells
ссылкой.Он также имеет метод solve
, который применяет Patterns
в заранее определенном порядке до тех пор, пока не будет достигнуто решение или пока не будет определено, что решение невозможно (поэтому метод грубой силы должен быть последним усилием рва).
Pattern
: Абстрактный класс, имеющий метод apply(Board)
, который применяет данный шаблон к указанному объекту платы (удаляет возможности из Cells
и устанавливает их, когда он знает, что осталась только одна возможность).Начиная с Sudoku Dragon - стратегия судоку , вы, вероятно, будете реализовывать такие шаблоны, как OneChoicePattern
, SinglePossibilityPattern
, OnlySquareRule
и т. Д.