текущей клеткой по диагонали, вертикали или горизонтали. Буквы в слове, которе
может быть получено в процессе обхода матрицы, должны быть расположены только
в порядке возрастания в соответсвии с алфавитным порядком.
Требуется перечислить все слова, состоящие не менее, чем из трех букв, которые
можно сформировать при обходе заданной матрицы. Слова необходимо упорядочить
по длине, а слова одной длины должны быть упорядочены в лексикографическом
порядке. Каждое слово должно быть выдано только один раз.
Исходная информация — значение N и буквенная матрица, заданная по строкам.
Результат — перечисление всех формируемых слов. Например, для входной инфор-
мации
3
one
top
dog
рузультирующий список слов равен dop, dot, eno, ent, eop, eot, gop, got, nop, not,
enop, enot.
Казалось бы, простейший способ решения задачи заключается в следующем. В
качестве исходной точки последовательно будем перебирать клетки матрицы, фор-
мируя в результате последовательного рекурсивного обхода матрицы в восьми допу-
стимых направлениях новые слова. Каждое сформированное слово будем заносить в
таблицу слов, если в ней сформированное слово отсутствует. Однако оценка порядка
временной сложности такого алгоритма показывает его принципиальную непригод-
ность.
Действительно, максимальная длина слова, которое можно сформировать по ука-
занным в задаче правилам, равна 26 — это слово abcde...xyz. Такое слово — единствен-
ное. Слов длины 25 можно сформировать 26 штук, вычеркивая из максимального
слова по одной букве. Слов длины 24 уже 26
2
и т.д. Самых коротких трехбуквен-
ных слов можно сформировать 26
23
. Это значит, что при создании нового слова его
нельзя сравнивать с таблицей уже имеющихся слов — на это просто не хватит ни
времени, ни памяти компьютера.
Известно, что проблема лексикографического упорядочивания хорошо решается
с помощью бинарных деревьев. В каждой вершине такого дерева будем хранить одну
букву. Правое поддерево соответствует "потомкам т.е. буквам, которые могут нахо-
диться в цепочке за корневой буквой. Левое поддерево соответствует "соседям т.е.
буквам, которые равноправны корневой букве.
Построим сначала по матрице бинарные деревья, которые соответствуют только
непосредственным соседям. Например, для указанной выше матрицы существуют
два дерева с пустыми потомками для символов p и t и следующие пять деревьев для
символов d, e, g, n, o:
d e
↘ ↘
o n
↙ ↙
t o
↙
p
140