Учитывая список строк, найдите наименьшую квадратную матрицу, которая содержит каждую из начальных строк. Строки могут появляться по горизонтали, вертикали или диагонали и вперед или назад, как в этом вопросе Word Search Puzzle .
Слова должны быть помещены в квадрат, по крайней мере, одно слово в каждом направлении (горизонтальное, вертикальное и диагональное). Слова должны появиться только один раз.
Таким образом, ввод - это просто список слов. Например: CAT, TRAIN, CUBE, BICYCLE
. Одним из возможных решений является:
B N * * * * *
* I * * C A T
* A C * * * *
* R * Y * * C
* T * * C * U
* * * * * L B
* * * * * * E
Я заменил заполнение букв звездочками только для ясности. Желаемый вывод должен включать случайные буквы заполнения.
AC
в вашем примере создаст другую,CAT
если это такT
.A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
не имеет решения.Ответы:
JavaScript (ES6), 595
628 680Отредактируйте некоторую очистку и объедините:
- функция P объединена внутри функции R
- calc x и z в том же .map
- когда решение найдено, установите x
равным 0 для выхода из внешнего цикла - объединенное определение и вызов W
Edit2 больше игры в гольф, случайное заполнение сокращено, внешняя петля пересмотрена ... посмотрите историю для чего-то более читабельного
В отличие от принятого ответа,это должно работать для большинства входов. Просто избегайте однобуквенных слов. Если выход найден, он оптимален и использует все 3 направления.Ограничение избегать повторения слов очень сложно. Мне приходилось искать повторяющиеся слова на каждом шаге, добавляя слово в сетку, и на каждый символ случайного заполнения.
Основные подфункции:
P (w) истина, если слово палиндром. Слово палиндром будет найдено дважды при проверке повторяющихся слов.
R (s) проверить повторяющиеся слова на сетке s
Q (s) заполняет сетку s случайными символами - это рекурсивно и возвращает в случае повторения слова - и может потерпеть неудачу.
W () рекурсивный, попробуйте заполнить сетку заданного размера, если это возможно.
Основная функция использует W (), чтобы найти выходную сетку, начиная с размера самого длинного входного слова и заканчивая суммой длины всех слов.
Разоблаченный и объясненный (неполный, извините, ребята, это много работы)
Тест в консоли Firefox / FireBug
F (['TRAIN', 'CUBE', 'BOX', 'BICYCLE'])
не заполнено
F ([«TRAIN», «ARTS», «RAT», «CUBE», «BOX», «BICYCLE», «STORM», «BRAIN», «DEPTH», «MOUTH», «SLAB»])
F ([ 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG'])
F ([ 'AA', 'AB', 'AC', 'AD', 'AE', 'AF'])
вывод не заполнен - @nathan: теперь вы не можете добавить еще один х без повторений. Вам понадобится большая сетка.
источник
C #
Вот простая реализация с еще предстоит проделать работу. Есть очень много комбинаций, чтобы получить наименьший размер. Так что просто использовал самый простой алгоритм, который только мог придумать.
Тестовое задание
источник
at least one word in each direction (horizontal, vertical and diagonal)
. Запуск тестовой программы, без горизонтального слова (3 по вертикали, 1