Ctrl K

Слова в буквенной сетке

Сложная
Вы делаете игру-головоломку: на поле grid размером m × n в каждой клетке стоит строчная латинская буква, а в dictionary лежит список слов. Слово считается найденным, если его можно «прочертить» по полю: начать с какой-нибудь клетки и каждую следующую букву брать из клетки, соседней с предыдущей по стороне (вверх, вниз, влево или вправо). Диагонали не считаются, и одну клетку внутри одного слова дважды использовать нельзя. Верните все слова из dictionary, которые можно найти на поле. Каждое слово — один раз, порядок любой.
Пример 1
grid=[['c', 'a', 't'], ['x', 'r', 'o'], ['d', 'o', 'g']], dictionary=['cat', 'car', 'rod', 'dog', 'tar', 'cart'] → ['cat', 'car', 'tar', 'rod', 'dog']

cat идёт по верхней строке, car — вправо и вниз, dog — по нижней строке, rod — вниз от r и влево. tar — от t влево и вниз. А для cart после r нужна соседняя t, а её рядом нет.

Пример 2
grid=[['a', 'b'], ['b', 'a']], dictionary=['aba', 'abab', 'aa'] → ['aba', 'abab']

aba и abab обходят клетки по кругу. Для aa две буквы a должны быть соседями, но они стоят по диагонали.

Пример 3
grid=[['z']], dictionary=['zz'] → []

Клетку нельзя использовать дважды, поэтому из одной z слово zz не собрать.

Ограничения
  • 1 ≤ m, n ≤ 12
  • grid[i][j] — строчная латинская буква
  • 1 ≤ len(dictionary) ≤ 3 · 10⁴
  • 1 ≤ len(dictionary[i]) ≤ 10, только строчные латинские буквы
  • Все слова в dictionary различны
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиВсе способы расставить пробелы СложнаяЗеркальные блоки из слов СложнаяСлово на сетке букв СредняяДорешать судоку СложнаяСклеить в палиндром Сложная
загружаем Python…
Вход
grid=[['c', 'a', 't'], ['x', 'r', 'o'], ['d', 'o', 'g']], dictionary=['cat', 'car', 'rod', 'dog', 'tar', 'cart']
Ожидается
['cat', 'car', 'tar', 'rod', 'dog']

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 75 тестов на сервере, включая скрытые.