Честно говоря, я, как программист, подошла бы к этой задаче иначе
Каждая деталь, какая бы она ни была, характеризуется своим контуром. Выделение контура - задача вполне решаемая, ибо много раз уже решена. Задаём ограничение: прямой контур - рамка паззла (вот тут могут возникнуть проблемы с деталями типа как у эдуки, где стык близок к прямой). Остальные детали стыкуем перебором: берём линию стыка одной детали, инвертируем её, как это делается в графических программах, и если достигнуто совпадение инвертированной линии со стыком другой детали (конечно, надо оставить небольшую погрешность при сравнении, поскольку полная точность вычислений невозможна), то эти детали стыкуются. Использованные стороны помечаем, чтобы не состыковать их ещё раз. Для оптимизации можно предварительно сравнивать стороны по длине, и если она не совпадает, не производить дальнейшие манипуляции. Единственное, такая программа не сможет собирать паззлы со сдвигом в стыках, но это тоже можно решить дальнейшей доработкой

Если бы у меня было много лишнего времени, может, и занялась бы, чисто из спортивного интереса, но увы
