Готово

Трошки про мій розв’язок. :pencil2: 
З самого початку я роблю декілька перевірок, щоб відхилити варіанти, які не підходять під умову.
Потім роблю масивчики над якими буду знущатись. Кросворд я починаю будувати з хреста, тобто з пересічення найдовшого горизонтального і вертикального слова, я їх називаю як слово Х та слово Y, в честь осей координат. В хрестовині можуть приймати участь лише слова, які складаються більше ніж з :five: букв (бо інакше ніяк :smiling_imp: ). Масив виглядає так:
```php
'SSXXQOFGJUZ' => [
    'JYNYFDSGI' => [
        'PTC',
        'ZGPPC',
        'IXEJNDOP',
        'JJFS'
    ],
    'ZGPPC'     => [
        'PTC',
        'JYNYFDSGI',
        'IXEJNDOP',
        'JJFS'
    ],
    'IXEJNDOP'  => [
        'PTC',
        'JYNYFDSGI',
        'ZGPPC',
        'JJFS'
    ]
]
```
Перший ключ - найдовше слово Х, другий ключ - найдовше слово Y, а потім масив з усіх інших слів. І так всі можливі комбінації.
Потім відбувається ітерація по всім слова Х, по всім словам Y. Для кожної пари X-Y перевіряється чи є в них спільна буква для побудови хрестовини. Якщо так, то тоді відбувається декілька перевірок стосовно інших чотирьох слів. А саме, ми знаємо довжину слова Х та довжину слова Y, в сумі інші два вертикальних слова на :one: більше за слово довжину слова Y, відповідно і горизонтальні слова. Тому спочатку арифметично перевіряємо, чи можна туди впихнути ці слова. Якщо так, тоді відбувається перевірка побуквенно. А саме перша та остання букви кожного слова перевіряються чи не конфліктують з суміжними словами.
В разі успішних перевірок - будується кросворд у текстовом вигляді. Він повертається, як масив, де ключ - це довжина верхнього горизонтального слова. Якщо варіантів побудови було декілька, то відбувається сортування по масиву ключам і вибирається перший елемент з масиву, так як він має найменшу довжину верхнього горизотального слова.

Піду щось перекушу :hamburger: