День сто пятьдесят третий. #ЗаметкиНаПолях
Решатель судоку
По мотивам давнишнего поста https://t.me/NetDeveloperDiary/83 решил сделать небольшую библиотеку для решения судоку на C#. Код здесь: https://dev.azure.com/sbenzenko/NetDeveloper/_git/SudokuSolver
Краткое описание
Сетка судоку представляет собой двумерный массив типа
Решение задачи (метод SolveSudoku):
1) В методе
2) В цикле пробуем записать в клетку цифры от 1 до 9. В методе
- нет одинаковых цифр в текущем секторе 3х3
- нет одинаковых цифр в текущем столбце
- нет одинаковых цифр в текущей строке
3) Если правила не нарушены, рекурсивно вызываем
Если
В противном случае нужно отменить сделанные изменения:
- устанавливаем значение клетки обратно в
- увеличиваем количество «отмен» в переменной
4) Если мы прошли по циклу в п.2 и ни одно число не подошло, возвращаем
В тестовом проекте (
Примечания:
- Пока нет визуального UI, возможно сделаю позже.
- Решение можно оптимизировать: выполнять поиск доступных цифр в п.2.
Источник и подробности с решением на Python (на английском языке): https://www.youtube.com/watch?v=auK3PSZoidc
Решатель судоку
По мотивам давнишнего поста https://t.me/NetDeveloperDiary/83 решил сделать небольшую библиотеку для решения судоку на C#. Код здесь: https://dev.azure.com/sbenzenko/NetDeveloper/_git/SudokuSolver
Краткое описание
Сетка судоку представляет собой двумерный массив типа
byte
. Первоначально заполняется цифрами из задачи судоку, свободные клетки нулями.Решение задачи (метод SolveSudoku):
1) В методе
FindNextCellToFill
находим следующую свободную клетку (со значением 0). Если метод возвращает -1, значит свободных клеток нет, задача решена.2) В цикле пробуем записать в клетку цифры от 1 до 9. В методе
IsValid
проверяем, не нарушает ли новая цифра правила:- нет одинаковых цифр в текущем секторе 3х3
- нет одинаковых цифр в текущем столбце
- нет одинаковых цифр в текущей строке
3) Если правила не нарушены, рекурсивно вызываем
SolveSudoku
(которая выполняет процедуру для следующей пустой клетки). Если
SolveSudoku
вернёт true
, значит сетка заполнена и задача решена (см. п.1). Выходим из процедуры.В противном случае нужно отменить сделанные изменения:
- устанавливаем значение клетки обратно в
0
,- увеличиваем количество «отмен» в переменной
BackTracks
(для статистики).4) Если мы прошли по циклу в п.2 и ни одно число не подошло, возвращаем
false
, т.е. решений задачи нет.В тестовом проекте (
SudokuSolverTests
) есть три примера решений судоку (лёгкого, среднего и «самого сложного известного»). Они же записаны в консольном проекте SolveSudokuConsole
от простого к сложному. Можете раскомментировать один из них и посмотреть решение. По количеству выводимых «отмен» (Backtracks
) очевидна сложность задачи.Примечания:
- Пока нет визуального UI, возможно сделаю позже.
- Решение можно оптимизировать: выполнять поиск доступных цифр в п.2.
Источник и подробности с решением на Python (на английском языке): https://www.youtube.com/watch?v=auK3PSZoidc