Форум программистов, компьютерный форум, киберфорум
Проекты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727

Sudoku DLX Solver - очень быстрый решатель судоку

09.02.2026, 15:07. Показов 2189. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал решатель судоку Sudoku DLX Solver и опубликовал его на гитхабе https://github.com/RoyalXXX/sudoku_dlx
Там есть и код и очень подробное описание на английском. Тут лишь я коротко напишу о проекте.

Алгоритмов решения судоку множество, самые банальные выложены на разных сайтах, например, https://www.geeksforgeeks.org/cpp/sudoku-in-cpp/ Тем не менее, я хотел, чтобы мой решатель был очень быстрым и решал быстро даже самые сложные судоку (как например, тот, который приведен в описании моего проекта на гитхабе) и чтобы он находил не только одно решение, а все решения или столько решений, сколько укажу.

Немного о моем Sudoku DLX Solver:

1. используется самый быстрый в этой области алгоритм танцующих ссылок (DLX) Дональда Кнута. Быстрее этого алгоритма ничего не найдете для решения судоку. Если и найдете код, который будет быстрее моего, то наверное там будет тот же алгоритм, но просто будет реализована многопоточность или будет написан специально под инструкции современных процессоров, либо может использоваться стековая память.

2. код написан на С++. Собственно, чтобы разбираться в алгоритме, я смотрел на чужие коды на разных языках, начиная от JS до Java и пытался понять, как все работает. Встречал и коды на С++, правда от С++ там почти ничего не было - все было написано в сишном стиле, много глобальных переменных, магических констант, все в стековой памяти, голые указатели, огромные утечки памяти и размер судоку нельзя было задать в рантайме из-за использования статических массивов. Одним словом, были коды из категории "запустил разок, посмотрел результат и закрыл программу". Такой мусор никто не станет использовать в своих приложениях.

Короче, поскольку я не нашел нормальный решатель на С++, то я приложил много усилий, чтобы перевести увиденное на нормальный С++. Мой Sudoku DLX Solver состоит из двух файлов: *.h и *.cpp, как я традиционно люблю делать. Старался писать все согласно философии С++, без сишкодерства.
Размер судоку можно задать на рантайме, использовал кучу, умные указатели, проверки, исключения, реализовал класс с инкапсуляцией. Во время написания постоянно проверял скорость, память. Скажу, что разница в производительности между моим "безопасным" решателем на векторах и стековыми реализациями почти мизерная из-за правильного резервирования памяти.

3. решатель работает не только для 9x9, но также для судоку любых размеров, 4, 16, 25 и т.д. Причем, можно найти не только одно решение, а можно получить прям все. Для функции поиска всего лишь нужно указать лимит поиска. Но обычно ищут либо одно решение (т.е. выставляют лимит на 1) или два судоку (чтобы убедиться, что судоку корректное и имеет только одно решение). Обычно последнее используется в алгоритмах для генерации судоку, чтобы убедиться, что сгенерированное судоку имеет только одно решение. Поиск второго и последующих решений обычно осуществляется очень быстро, поэтому без проблем можно выставить большие лимиты для поиска.

4. генератора судоку не добавил, поскольку отдельного алгоритма для генерации не существует, а используется тот же решатель. Типа добавляются рандомно (или чуть по-умному) стартовые подсказки и постоянно проверяется, является ли это судоку корректным или нет (т.е. имеющим ровно одно решение). Т.е. генерация более сложный процесс, чем сам поиск одного решения, поэтому именно для генерации нужны такие быстрые решатели судоку.
4
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2026, 15:07
Ответы с готовыми решениями:

Решатель Sudoku?
Меня интересует такая штука, как код способный решить Sudoku но я просто не знаю что для этого...

Решатель Судоку Qt C++
Здравствуйте, я новичок, дали задание разработать игру "решатель судоку", задача, чтобы при наборе...

Решатель судоку без рекурсии
Делаю решатель судоку без рекурсии. Выбивает ошибку извлечения из пустого стека. НЕ пойму почему....

32
Злостный нарушитель
 Аватар для Verevkin
10893 / 5829 / 1288
Регистрация: 12.03.2015
Сообщений: 26,896
09.02.2026, 22:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
мне просто лень тестировать судоку alexu_007, а он спрашивал время. Но учитывая, что ты тестировал и его судоку, и мое, то я указал время моего судоку (которое мне было известно), чтобы он приблизительно понимал насколько сабж быстрый.
А так для тебя ничо.
Ну ладно...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 22:13  [ТС]
alexu_007, мой проект выложен на гитхабе, так что можешь сам проверять, экспериментировать, даже внедрять в свою программу. Хотя, не думаю, что для твоей программы тебе нужна прям высокая скорость.
Сила сабжа еще в том, что если у судоку множество решений (т.е. когда это корявое судоку), то решатель думает больше всего для первого решения, а все последующие решения находит за мизерное количество времени, например, со скоростью 5-20 µs на одно решение.

***

Ну и чтобы не думали, что я хвастаюсь, я официально заявляю - я не являюсь автором алгоритма сабжа, поскольку этот алгоритм придуман Дональдом Кнутом (об этом я пишу и в описании). Так что, никаких открытий я не делал. Просто написал на С++.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
09.02.2026, 22:18
Цитата Сообщение от Royal_X Посмотреть сообщение
имеет только одно решение)
Да ладно. Как вам такое? Ну и вариант Verevkinа еще третий до кучи:
Миниатюры
Sudoku DLX Solver - очень быстрый решатель судоку  
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 22:31  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Да ладно. Как вам такое?
ты неправильно ввел данные. Обрати внимание на нижний правый блок. 7 и 3 должны быть рядом, а у тебя между ними пустая ячейка.
и да, там точно одно решение

alexu_007, и если тебе интересно, то у судоку, которое у тебя получилось при неправильном вводе, 3359 решений и все они находятся у меня за 10 мс.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
09.02.2026, 22:33
Предложенное Royal_X судоку решается чисто аналитически, без необходимости пользоваться перебором, когда аналитика заходит в тупик. Предложенное мной "самое сложное..." аналитически не находит ни одной цифры (может конечно мой "анализ" несколько туповат...) и сразу приходится пользоваться подбором. Вот эта нижняя циферка на моей программе показывает, сколько раз программе приходится лазить в подбор, до полного решения задачи. О сложности алгоритма я сужу по ней. Время, к сожалению, у меня не замеряется, т.к. результат появляется на экране быстро (почти сразу, доли секунды).

Вот сложность по моей методике моего судоку, сложность судоку Royal_X см. выше:
Миниатюры
Sudoku DLX Solver - очень быстрый решатель судоку  
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 22:36  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
сложность судоку Royal_X см. выше
так ты же решил вообще не то судоку
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
09.02.2026, 22:42
Цитата Сообщение от Royal_X Посмотреть сообщение
ты неправильно ввел данные. Обрати внимание на нижний правый блок. 7 и 3 должны быть рядом, а у тебя между ними пустая ячейка.
и да, там точно одно решение
Прошу прощения, точно одно решение. Ну и 10 мс за 3359 решений тоже впечатляет...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 22:49  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ну и 10 мс за 3359 решений тоже впечатляет...
но на практике это бесполезные данные, поскольку у корректного судоку должно быть ровно одно решение и чтобы убедиться, что у судоку ровно одно решение, в сабже можно выставить лимит на 2 - поиск двух решений, типа если найдутся два решения, то значит судоку некорректное и дальше искать другие решения смысла нет, а если найдется одно, то значит корректное судоку.
Но я специально ради интереса выставил большой лимит для поиска, чтобы найти все решения
Цитата Сообщение от alexu_007 Посмотреть сообщение
впечатляет...
впечатляет там то, что я написал на векторах и все равно оно очень быстрое. Но если писать небезопасный код на стеке в целях спортивного программирования, то оно будет работать еще быстрее. Мне показалось, что оно того не стоит. Лучше пусть будет нормальный код. Я изначально стековую память использовал, но потом увидел, что переход на векторы незначительно влияет на производительность, поэтому решил лучше с векторами, чтобы еще и в рантайме размер задавать.
Недостатки стековой памяти я указал в Sudoku DLX Solver - очень быстрый решатель судоку
0
 Аватар для Noname2331
95 / 85 / 10
Регистрация: 22.12.2024
Сообщений: 586
09.02.2026, 23:11
Очередной шикарный проект от вас

Интересно, на высоте вашего большого опыта реализации популярных логических игр, появились ли у вас идеи о своей собственной, уникальной игре?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 23:13  [ТС]
Цитата Сообщение от Noname2331 Посмотреть сообщение
появились ли у вас идеи о своей собственной игре
я начинал делать хоррор-игру от первого лица с логическими головоломками, правда поскольку программирование мое хобби, а в реальной жизни у меня сейчас другие более приоритетные задачи, которые я постоянно решаю, то никак не сяду за эту игру, не нахожу времени и настроения...
0
 Аватар для Noname2331
95 / 85 / 10
Регистрация: 22.12.2024
Сообщений: 586
09.02.2026, 23:22
Цитата Сообщение от Royal_X Посмотреть сообщение
я начинал делать хоррор-игру от первого лица с логическими головоломками, правда поскольку программирование мое хобби, а в реальной жизни у меня сейчас другие более приоритетные задачи, которые я постоянно решаю, то никак не сяду за эту игру, не нахожу времени и настроения...
Ну тогда просто сообщу, что у вас в киберпространстве есть ученик в лице меня, который ждет любой ваш новый проект в сфере программирования Вдохновения и энергии вам желаю во всех направлениях.
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
09.02.2026, 23:25  [ТС]
Noname2331, спасибо за добрые слова. Но вместо того, чтобы ждать, лучше сами начните что-то разрабатывать. Писать программы, даже мелкие, это лучший способ изучения языка.
1
 Аватар для Noname2331
95 / 85 / 10
Регистрация: 22.12.2024
Сообщений: 586
09.02.2026, 23:28
Цитата Сообщение от Royal_X Посмотреть сообщение
Noname2331, спасибо за добрые слова. Но вместо того, чтобы ждать, лучше сами начните что-то разрабатывать. Писать программы, даже мелкие, это лучший способ изучения языка.
Я уже искушенный. После основной работы со всякими кибернетисами и прочей коммерческой шизой быстрее бегу домой, чтобы продолжить работу над своим эмулятором процессора на JS (упрощенный 6502, "дальше упрощать некуда"). Но вот поглядываю на с.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2026, 23:28

Судоку решатель
Доброго времени суток, может кто сможет помочь, пытаюсь сделать судоку решатель в Qt, код отдельно...

Sudoku: рандомная генерация пустых клеток
Делал я всё через StringGrid, мне не понятно, как написать магический куб (он будет ниже) в коде, и...

Решатель задач по метематике
Дайте совет! я решил создать програму в которой буду решатся все задачи по математике с 1 по 11...

У меня заработал гидродинамический решатель на видеокарте
Всем привет! Я пишу свою гидродинамическую программу на С/С++, cuda C с 2009 года. Вот ссылка на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru