|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
|
Sudoku DLX Solver - очень быстрый решатель судоку09.02.2026, 15:07. Показов 1873. Ответов 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
Решатель судоку без рекурсии |
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 09.02.2026, 22:11 | |
|
0
|
|
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
|
| 09.02.2026, 22:13 [ТС] | |
|
alexu_007, мой проект выложен на гитхабе, так что можешь сам проверять, экспериментировать, даже внедрять в свою программу. Хотя, не думаю, что для твоей программы тебе нужна прям высокая скорость.
Сила сабжа еще в том, что если у судоку множество решений (т.е. когда это корявое судоку), то решатель думает больше всего для первого решения, а все последующие решения находит за мизерное количество времени, например, со скоростью 5-20 µs на одно решение. *** Ну и чтобы не думали, что я хвастаюсь, я официально заявляю - я не являюсь автором алгоритма сабжа, поскольку этот алгоритм придуман Дональдом Кнутом (об этом я пишу и в описании). Так что, никаких открытий я не делал. Просто написал на С++.
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
|
|
| 09.02.2026, 22:18 | |
|
0
|
|
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
||
| 09.02.2026, 22:31 [ТС] | ||
|
и да, там точно одно решение alexu_007, и если тебе интересно, то у судоку, которое у тебя получилось при неправильном вводе, 3359 решений и все они находятся у меня за 10 мс.
0
|
||
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
|
|
| 09.02.2026, 22:33 | |
|
Предложенное Royal_X судоку решается чисто аналитически, без необходимости пользоваться перебором, когда аналитика заходит в тупик. Предложенное мной "самое сложное..." аналитически не находит ни одной цифры (может конечно мой "анализ" несколько туповат...) и сразу приходится пользоваться подбором. Вот эта нижняя циферка на моей программе показывает, сколько раз программе приходится лазить в подбор, до полного решения задачи. О сложности алгоритма я сужу по ней. Время, к сожалению, у меня не замеряется, т.к. результат появляется на экране быстро (почти сразу, доли секунды).
Вот сложность по моей методике моего судоку, сложность судоку Royal_X см. выше:
0
|
|
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
|
| 09.02.2026, 22:36 [ТС] | |
|
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
|
||
| 09.02.2026, 22:42 | ||
|
0
|
||
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
|||
| 09.02.2026, 22:49 [ТС] | |||
|
Но я специально ради интереса выставил большой лимит для поиска, чтобы найти все решения Недостатки стековой памяти я указал в Sudoku DLX Solver - очень быстрый решатель судоку
0
|
|||
|
92 / 72 / 10
Регистрация: 22.12.2024
Сообщений: 498
|
|
| 09.02.2026, 23:11 | |
|
Очередной шикарный проект от вас
Интересно, на высоте вашего большого опыта реализации популярных логических игр, появились ли у вас идеи о своей собственной, уникальной игре?
0
|
|
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
||
| 09.02.2026, 23:13 [ТС] | ||
|
0
|
||
|
92 / 72 / 10
Регистрация: 22.12.2024
Сообщений: 498
|
||
| 09.02.2026, 23:22 | ||
Вдохновения и энергии вам желаю во всех направлениях.
1
|
||
|
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,539
|
|
| 09.02.2026, 23:25 [ТС] | |
|
Noname2331, спасибо за добрые слова. Но вместо того, чтобы ждать, лучше сами начните что-то разрабатывать. Писать программы, даже мелкие, это лучший способ изучения языка.
1
|
|
|
92 / 72 / 10
Регистрация: 22.12.2024
Сообщений: 498
|
||
| 09.02.2026, 23:28 | ||
|
0
|
||
| 09.02.2026, 23:28 | |
|
Судоку решатель
У меня заработал гидродинамический решатель на видеокарте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|