Справка по программированию - Как структурировать программу Sudoku Solver?

1

Я пытаюсь создать программу sudoku solver в Java (возможно, Python). Мне просто интересно, как мне следует структурировать это...

Я создаю класс и делаю каждый блок объектом этого класса (9x9 = 81 объект)? Если да, как я могу управлять всеми объектами - другими словами, как заставить их всех вызвать определенный метод в классе?

Я просто создаю функции для вычисления и управления всеми числами там с чем-то вроде многомерного массива?

И вообще, даже если бы я мог просто создать несколько функций, как бы я мог управлять всеми объектами, если бы я должен был сделать каждый блок объектом?

Спасибо.

  • 0
    Если вы застряли и интересуетесь пошаговым решением, Питер Норвиг написал статью о решателе судоку, реализованном на Python.
  • 0
    Вы просто ищете структуры данных для хранения / отображения или также структуры данных, которые являются частью решателя?
Теги:
data-structures
design
sudoku

9 ответов

8
Лучший ответ

Если вы застряли и заинтересованы в пошаговом решении, Питер Норвиг написал статью о Судоку solver, реализованный в Python.

11

Не переусердствуйте. Это 2-мерный массив или, возможно, класс Board, который в лучшем случае представляет собой 2-мерный массив. Имеют функции, которые вычисляют заданную строку/столбец и функции, которые позволяют вам получить доступ к каждому квадрату. Можно использовать дополнительные методы, подтверждающие, что каждый суб-3x3 и строка/столбец не нарушают требуемые ограничения.

  • 0
    если объекты хороши для сокрытия сложности, почему бы и нет? это должно скрыть выбор 2d-массива и абстрагировать его.
  • 1
    Не добавляйте сложность, пока она не понадобится - и здесь она не нужна.
Показать ещё 1 комментарий
2

Ну, я бы использовал один класс для самого судоку, с массивом 9 х 9 и всеми функциями для добавления чисел и обнаружения ошибок в шаблоне.

Еще один класс будет использоваться для решения головоломки.

1

просто для удовольствия, вот что должно быть самой короткой программой, в python, которая может решить сетку sudoku:

def r(a):i=a.find('0') if i<0:print a [m in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)]or r(a[:i]+m+a[i+1:])for m in`14**7*9`]r(raw_input())

hmm ok, это довольно загадочно, и я не думаю, что это соответствует вашему вопросу, поэтому я приношу свои извинения за этот шум:)

В любом случае вы найдете объяснение этих 173 символов здесь. Там также объяснение на французском здесь

1

Самый простой способ сделать это - представить плату с помощью массива 2D 9x9. Вам понадобятся ссылки на каждую строку, столбец и поле 3x3 как отдельный объект, поэтому сохранение каждой ячейки в String имеет больше смысла (на Java), чем использование примитива. С помощью String вы можете хранить ссылки на один и тот же объект в нескольких контейнерах.

1

Вам нужно сделать это на Python или Java? Я много программирую на Python, но это можно сделать гораздо более сжато с помощью целочисленной программы с использованием языка AMPL или GLPK, который я считаю более элегантным (и, как правило, более эффективным) для таких проблем.

Вот он в AMPL, хотя я не проверял, как это работает: http://taha.ineg.uark.edu/Sudoku.txt

0

Для класса правил достаточно класса, содержащего 1d-массив из 81 ints (0 пуст). Класс правил применяет правила (в каждой строке, столбце или квадрате 3x3 нет повторяющихся номеров). Он также имеет массив из 81 bools, поэтому он знает, какие ячейки фиксированы и которые необходимо решить. Открытый интерфейс к этому классу имеет все методы, необходимые для управления доской:

int getCell(int x, int y);
bool setCell(int x, int y, int value);
bool clearCell(int x, int y);
int[] getRow(int x);
int[] getCol(int y);
int[] getSubBox(int x, int y);
void resetPuzzle();
void loadPuzzle(InputStream stream);

Затем ваш решатель использует открытый интерфейс для этого класса для решения головоломки. Классная структура решателя, который я предполагаю, является целью написания 5-миллионного решателя Судоку. Если вы ищете подсказки, я отредактирую это сообщение позже.

0

Во-первых, похоже, что есть два типа ячеек.

  • Известные звонки; те, у которых фиксированное значение, нет выбора.

  • Неизвестные ячейки; те, у которых есть набор значений кандидата, который сводится к одному окончательному значению.

Во-вторых, существует несколько групп ячеек.

  • Горизонтальные строки и вертикальные столбцы, которые должны иметь одну ячейку каждого значения. Это ограничение используется для удаления значений из разных ячеек в строке или столбце.

  • 3x3 блоков, которые должны иметь одну ячейку каждого значения. Это ограничение используется для удаления значений из разных ячеек в блоке.

Наконец, есть общая сетка. Это имеет несколько дополнительных представлений.

  • Это 81 ячейка.

  • Клетки также собираются в сетку 3x3 блоков 3x3.

  • Ячейки также собираются в 9 столбцов.

  • Клетки также собираются в 9 строк.

И у вас есть объект стратегии решателя.

  • В каждой Неизвестной ячейке установлено значение set( range(1,10) ) в качестве значений кандидата.

  • Для каждой строки, столбца и блока 3x3 (27 разных коллекций):

    а. Для каждой ячейки:

    • Если он имеет определенное значение (известные ячейки и Неизвестные ячейки реализуют это по-другому): удалите это значение из всех других ячеек в этой группе.

Вышеупомянутый должен быть повторен до тех пор, пока изменения не будут найдены.

В этот момент вы либо решили (все ячейки сообщают определенное значение), либо у вас есть несколько ячеек с несколькими значениями. Теперь вам нужно заняться сложным обратным следящим решением, чтобы найти комбинацию оставшихся значений, которые "работают".

  • 0
    «Объект решающей стратегии»? Вы имеете в виду функцию поиска?
  • 0
    @ Harlequin: Может быть, просто поиск. Тем не менее, он обновляет состояние ячеек как часть этого поиска. И, возможно, это не совсем шаблон стратегии . Я думал вслух, чтобы ответить на вопрос, а не на самом деле решить проблему.
0

Может быть, дизайн, в котором был квадрат на квадрат, и еще один класс для представления самой загадки, которая имела бы коллекцию ящиков, содержала бы все правила для взаимодействия с ящиками, а управление общей игрой было бы хорошим дизайном.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню