stfalcon-studio/brain-warm-up_v2-crossword — pull request #3 by fre5h (2013-09-04 21:35:18+00:00)
Title: Готово

Трошки про мій розв’язок. :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: