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

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


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

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

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

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


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