|
Нарушитель
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
|
|
| 09.02.2026, 15:07 | |
|
Ответы с готовыми решениями:
32
Решатель судоку без рекурсии |
|
Злостный нарушитель
10893 / 5829 / 1288
Регистрация: 12.03.2015
Сообщений: 26,896
|
|
| 09.02.2026, 22:11 | |
|
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 | |
|
0
|
|
|
Нарушитель
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
|
||
| 09.02.2026, 22:31 [ТС] | ||
|
и да, там точно одно решение alexu_007, и если тебе интересно, то у судоку, которое у тебя получилось при неправильном вводе, 3359 решений и все они находятся у меня за 10 мс.
0
|
||
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
|
|
| 09.02.2026, 22:33 | |
|
Предложенное Royal_X судоку решается чисто аналитически, без необходимости пользоваться перебором, когда аналитика заходит в тупик. Предложенное мной "самое сложное..." аналитически не находит ни одной цифры (может конечно мой "анализ" несколько туповат...) и сразу приходится пользоваться подбором. Вот эта нижняя циферка на моей программе показывает, сколько раз программе приходится лазить в подбор, до полного решения задачи. О сложности алгоритма я сужу по ней. Время, к сожалению, у меня не замеряется, т.к. результат появляется на экране быстро (почти сразу, доли секунды).
Вот сложность по моей методике моего судоку, сложность судоку Royal_X см. выше:
0
|
|
|
Нарушитель
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
|
|
| 09.02.2026, 22:36 [ТС] | |
|
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
|
||
| 09.02.2026, 22:42 | ||
|
0
|
||
|
Нарушитель
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
|
|||
| 09.02.2026, 22:49 [ТС] | |||
|
Но я специально ради интереса выставил большой лимит для поиска, чтобы найти все решения Недостатки стековой памяти я указал в Sudoku DLX Solver - очень быстрый решатель судоку
0
|
|||
|
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 [ТС] | ||
|
0
|
||
|
95 / 85 / 10
Регистрация: 22.12.2024
Сообщений: 586
|
||
| 09.02.2026, 23:22 | ||
Вдохновения и энергии вам желаю во всех направлениях.
1
|
||
|
Нарушитель
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
|
|
| 09.02.2026, 23:25 [ТС] | |
|
Noname2331, спасибо за добрые слова. Но вместо того, чтобы ждать, лучше сами начните что-то разрабатывать. Писать программы, даже мелкие, это лучший способ изучения языка.
1
|
|
|
95 / 85 / 10
Регистрация: 22.12.2024
Сообщений: 586
|
||
| 09.02.2026, 23:28 | ||
|
0
|
||
| 09.02.2026, 23:28 | |
|
Судоку решатель
У меня заработал гидродинамический решатель на видеокарте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
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: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|