Я бы, наверное, сделал это в два прохода. Первый будет преобразовывать прямоугольники в набор точек (в порядке намотки), включая точки, где угол другого прямоугольника является точкой вдоль ребра. Таким образом, вы получите график точек, в котором вы сможете легко определить, какие точки распределены между какими прямоугольниками.
При этом просто найдите на своей диаграмме первую точку без общих ректов и начните проходить маршруты вдоль точек, у которых нет общих ректов, или двух общих ректов, где предыдущая точка не имеет общих ректов, пока не вернетесь к отправная точка.
Вам понадобится сохранить стек для вашего маршрута, а также карту ранее исследованных точек.
Я сделал это совсем недавно (хотя это не ограничивалось речами, и я уже сделал первый проход), и это работало довольно хорошо. Я видел, что он способен рассчитывать маршрут на графике примерно на 30 точек в секунду больше, чем я мог рассчитывать в int, поэтому производительность казалась довольно хорошей, хотя это было в C ++.