вообщем тут думаю такой ход действий. тест грани на сосесдство с пустотой--->в зависимости от стороны которая соседствует формируем массив видимых блокоы лежащих на ее пути и сортируем по наименьшей координате (в зав-ти от стороны, если правая сторона базового блока то сортируем то что справа по х1, слева по х2 и т.д.) ---> формируем блок и перезапускаем заново цикл, каждый новый найденный блок помечаем ---> когда пустота закончится прогоняем циклом все помеченные найденные блоки на возможность слития. как то так наверное