Запрограммировать такое будет не легко... Но реально) Это задачка уровня всероссийской олимпиады для школьников. Как-то на подготовке решал подобную. Тут появилось пара идеек по алгоритму - может поможет)
1. В таблице надо хранить не кусочки паззлов, а их части - то есть 4 стороны, естественно не забывая вешать к ним id кусочков.
2. Снимать кусочки на контрастном монотонном, относительно паззла фоне, тогда будет легко отличить паззл.
3. Возможно хранить даже битовые маски паззлов, тогда:
4. Проверку паззлов на стыкуемость можно будет организовать простой и быстрой операцией AND, которая будет равна 0 (в идеале, а реально близкой к нулю) при возможности состыковать детали. Обязательно записывать уровень отличия.
5. Организовать "паззл" в виде "динамической сетки" (уже не помню как это правильно называется), где каждый элемент имеет соседей слева, справа, сверху, снизу, либо не имеет с 1-2 сторон.
6. При возникновении неоднозначностей в дереве, можно на месте неоднозначностей (на основе уже записанных уровней отличия) произвести проверку по цветам.
7. Ещё что-то
8. Profit!
PS: Этот алгоритм впринципе можно оптимизировать донельзя... Например использовать сжатые битовые маски (чё-то типа mip-mapping'a) - тогда можно будет очень быстро отсекать заранее неверные варианты, или (при даже по суммам "1" или "0", что сложнее)