![]() |
|
![]() ![]() ![]() |
|
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Доброго всем времени суток!!!
![]() До учебы еще целый месяц, делать нечего. Поэтому учу С++ по книге Дейтела. А в ней в разряде "головоломные" раздела на строки предложена задача на генерацию кроссворда (заполненный словами, желательно симметричный) Ну, очевидное решение у меня есть - простой backtracking. Но, по-моему, очень (!) это неэффективно. В сети исходников нет (вроде искал хорошо), но есть куча готовых программ. Может кто, грешным делом, занимался этой проблемой? Подскажите хотя бы идею Заранее спасибо -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Уважаемые форумчане! Я конечно понимаю, что спасение утопающих - дело рук самих утопающих. Но неужели мой вопрос окажется неуслышенным?
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Я не понял - речь о генерации сетки, заполнении готовой сетки, both?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Akina,
Генерация готовой сетки по словарю (т.е. both) как я понял в условии задачи, входные параметры = это только размер кроссворда, а дальше генерится заполненная сетка со словами -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
nostromo |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
Я, пожалуй, сделал бы следующую вариацию бэктрекинга.
Сначала, создаем базу данных с таблицей, содержащей поля: слово, длина слова, 1-я буква, 2-я буква, ...., 20-я буква. По всем полям создаем индексы для быстрого поиска. Запросы типа "найти все слова длины 6 где 2-я буква=А и 5-я буква=Ц" должны выполняться весьма быстро. Таблица одна, скорее всего целитком влезет в память, поэтому полноценную СУБД задействовать, возможно, особого смысла нет и можно ограничиться самодельной программной реализацией. Затем генерируем сетку нужной формы и пытаемся ее заполнять (обычный бэктрекинг). Думаю, что для типичных кроссвордов и со словарем в несколько тысяч слов время генерации таким методом будет вполне приемлемым. В случае, когда словарь мал, алгоритм может сильно зависеть от того, насколько он мал и каковы требования к размеру и форме кроссворда. В грубом варианте, можно перебирать размещения слов на сетке в допустимых границах (действительно тяжелый перебор). --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
nostromo,
Во-первых, спасибо за ответ и за участие (к сожалению, пока 100 постов нет ![]() во-вторых, получается, что оптимальным вариантом является сначала генерация сетки, а потом ее заполнение? Совместить эти процессы никак не получится? или это нерационально? Тем более если словарь не очень большой -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Kernigan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Хотел бы тебе чем-то помощь, но, к сожалению, подобными вещами не занимался, хотя возможность была.
Надеюсь, что до конца каникул и до начала учебного года, ты всёже найдёшь правильное решение. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Вроде бы, нашел толковый вариант
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |