Я программирую решение Sudoku в Java для сетки 9x9.
У меня есть методы для:
-
печать сетки
-
инициализация платы с заданными значениями
-
тестирование конфликтов (если одно и то же число находится в одной строке или подсетей 3x3)
-
метод поместить цифры один за другим, что требует наибольшей работы.
Прежде чем я подробно расскажу об этом методе, имейте в виду, что я должен использовать рекурсию для ее решения, а также обратное отслеживание (смотрите апплет здесь как пример http://www.heimetli.ch/ffh/simplifiedsudoku.html)
Кроме того, я решаю этот Судоку, двигаясь вертикально вниз, начиная с верхнего левого угла, через первый столбец, а затем через второй столбец и т.д.
До сих пор у меня есть следующее:
public boolean placeNumber(int column){
if (column == SUDOKU_SIZE){ // we have went through all the columns, game is over
return true;
}
else
{
int row=0; //takes you to the top of the row each time
while (row < SUDOKU_SIZE) loops through the column downwards, one by one
{
if (puzzle[row][column]==0){ //skips any entries already in there (the given values)
puzzle[row][column]=1; //starts with one
while(conflictsTest(row,column)){ //conflictsTest is the method I wrote, which checks if the given parameters are in conflict with another number
puzzle[row][column] += 1;
}
//BACK TRACKING
placeNumber(column); //recursive call
}
else{
row++; // row already has a number given, so skip it
}
}
column++; // move on to second column
placeNumber(column);
}
return false; // no solutions to this puzzle
}
Где я назвал BACKTRACKING, я считаю, что оставшаяся часть моего кода должна идти.
Я придумал что-то вроде:
- если значение равно 10, установите это значение обратно на ноль, верните строку и увеличьте это значение на 1
Эта стратегия "обратного отслеживания" не работает точно по нескольким причинам:
-
что, если предыдущая строка была заданной величиной (иначе я не должен увеличивать ее или касаться ее, а вместо этого возвращаться к последнему значению, которое я там разместил)
-
что, если предыдущее значение было 9. и если я увеличил это на 1, теперь мы на 10, что не сработает.
Кто-нибудь может помочь мне?