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