powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Алгоритм генерации кроссворда
13 сообщений из 13, страница 1 из 1
Алгоритм генерации кроссворда
    #33568188
Ketan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Условие: задана сетка кроссворда, есть словарь, необходимо заполнить сетку словами.
У кого нибудь есть идеи алгоримов или структур данных которые можно использовать..
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33568468
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KetanУсловие: задана сетка кроссворда, есть словарь, необходимо заполнить сетку словами.
У кого нибудь есть идеи алгоримов или структур данных которые можно использовать..Алгоритм составления всевозможных кроссвордов вообщем-то очевиден. Вряд ли без рекурсии обойдешься.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Для всех подходяших к итой строке (столбцу) слов
{
    Если нет подходящих слов
        ретурн;
    Пока есть подходящее слова
    {
        Вставляем житое подходящее слово в эту строку (столбец);
        Если сетка не заполнена
            вызываем тоже для и+ 1 -ой строки (столбца);
        иначе
            сохраняем кроссворд;
     }
}
А над различными вариантами бэктрегинга можно подумать.
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33568480
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажеца тут надо писать програму !!!
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33568517
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сетку мона описать массивами, описывающими пересечения:
1-й элемент длина, далее идут тройки (номер символа в данной строке, номер строки с которой пересекается, номер символа в строке с которой пересекается).
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33568523
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivМне кажеца тут надо писать програму !!!Да ладно!
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33568701
Ketan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал через рекурсию, но слишком долго если перебирать все ветки(ну не все а до первой подходящей)
нужна какая нибудь умная рекурсия или чтото принципиально другое
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33569035
Gradient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаешь класс "слово".
Изначально заполняется нулями.
Список "зависимых объектов-слов" (например указатель на объект - )
(Это м.б. карта(map), т.к. два слова в двух и более местах не пересекаются. Реализация этой функциональности может быть вынесена в отдельный класс. Но можно и тут.)

Он должен уметь:
* Отвечать на вопрос "Заполнено ли слово целиком?" (тут нужны две проверки: 1) все буквы заполнены 2) такое слово есть в словаре)
* отвечать на вопрос "Можно ли вставить заданное слово?" (тут проверяем 1) подходит ли слово по кол-ву букв 2) если некоторые буквы уже заполнены по-другому, то возвращаем false)
* Если карта зависимостей ведется в этом классе, то уметь проставлять буквы в зависимых словах.


Итак, инициализируем vector или list из "слов" (создаем их в нужном количестве и правильно заполняем список зависимостей в каждом объекте)

Дальше приблизительно такой цикл:

* Берем наугад слово из словаря и если его нет среди уже заполненных слов, пытаемся его запихнуть в короссворд.
* если кроссворд заполнен, то улыбаемся и потираем руки (break).
* переходим к следующей итерации цикла (тут вполне можно зациклиться намертво, если ни одно слово из словаря добавить нельзя, а кроссворд еще не заполнен. варианты: 1) по нажатию на клавишу начинать все сначала; 2) Начинать сначала по таймауту или кол-ву итераций цикла; 3) завести массив bool'ов "а это слово уже попробовано. не подошло" и при тотальном его заполнении начинать заново 4, 5, 6 ... :-))

Это навскидку. Конечно, уже сейчас можно начинать оптимизировать метод, но для большого словаря (много больше кроссворда) вполне подойдет. И описывать это imho дольше, чем писать программу :-)
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33569047
Gradient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо Gradient(например указатель на объект - ) следует читать "(например указатель на объект - позиция в this - позиция в объекте, на который указатель)"
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33569925
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ketanсделал через рекурсию, но слишком долго если перебирать все ветки(ну не все а до первой подходящей)
нужна какая нибудь умная рекурсия или чтото принципиально другоеЯ и говорил, что над оптимизацией думать надоть. Если словарь достаточно большой, то имеет смысл разбить все слова на группы по кол-ву символов.
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33569973
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ketanсделал через рекурсию, но слишком долго если перебирать все ветки(ну не все а до первой подходящей)
нужна какая нибудь умная рекурсия или чтото принципиально другоеВ процессе подстановок слов можно сразу отметать варианты, которые не согласуются с правилами языка (допустим, наинаются на "ь", последовательности букв, типа "йы", "аь", "шы", ну и т.д.)
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33569980
Ketan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А словарь и был представлен в виде матрицы [длина слова, слова]
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #33570355
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроме того, мона подумать над очередностью перебора строк.
Лучше всего организоваоть его так, чтобы каждая следующая проверяемая строка имела максимальное кол-во пересечений с уже заполненными.
...
Рейтинг: 0 / 0
Алгоритм генерации кроссворда
    #34159095
На самом деле все намного сложнее, чем вы думаете.
Алгоритм составления кроссвордов вообще неочевиден.
Ну да, конечно, если вам нужно заполнить сетку из нескольких слов с небольшим количеством пересечений, то тут подойдет обычный бэктрекинг.
А если вы задумываетесь уже об оптимизации, о составлении кроссвордов на сотню слов с большой плотностью пересечений, то обычная рекурсия тут уже не поможет, нужны алгоритмы другого типа.
Кое что можно посмотреть на
http://www.vologda.ru/~apiskunov/science.html
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Алгоритм генерации кроссворда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]