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