Двумерные ограничения массива: судоку

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

Общая идея моего текущего алгоритма состоит в том, чтобы добавить все переменные, которые находятся в подобласти (например, поле 3x3 для сетки 9x9), в список, а затем переставить все значения в этом списке для создания NotEqualConstraints между каждой переменной. Приведенный ниже код работает правильно для 1-й подобласти сетки NxN, но я не уверен, как мне изменить это, чтобы перебирать остальную часть всей сетки.

int incSize = (int)Math.sqrt(svars.length);

ArrayList<Variable> subBox = new ArrayList<Variable>();

for (int ind = 0; ind < incSize; ind++) {
for (int ind2 = 0; ind2 < incSize; ind2++) {
    subBox.add(svars[ind][ind2]);
    }
}

for (int i = 0; i < subBox.size(); i++) {
for (int j = i + 1; j < subBox.size(); j++) {
   NotEqualConstraint row = new NotEqualConstraint(subBox.get(i), subBox.get(j));
   constraints.add(row);
   }
}

Может ли кто-нибудь направить меня в правильном направлении относительно того, как я могу изменить код, чтобы воздействовать на каждую подобласть, а не только на верхний левый?

редактировать: Я также готов попробовать любой алгоритм, который работает, это не обязательно чтобы добавить все значения в ArrayList для каждой подобласти. Если вы видите лучший способ, поделитесь, пожалуйста, своими соображениями

6
задан Ben Siver 16 October 2013 в 18:46
поделиться