решение кстати простое, не проверял, но в голове сходится..
colspan = max_x - min_x +1; // для '1,2,4,5' => min 1, max 5 => min_x = 1%3 max_x = 5%3
rowspan = max_y - min_y + 1;// для '1,2,4,5' => min 1, max 5 => min_y = (int)1/3 max_y = (int)5/3
осталось выкинуть лишние ячейки
рисуй любую ячейку которая не в 'cells' кроме минимального значения cells
colspan = max_x - min_x +1; // для '1,2,4,5' => min 1, max 5 => min_x = 1%3 max_x = 5%3
rowspan = max_y - min_y + 1;// для '1,2,4,5' => min 1, max 5 => min_y = (int)1/3 max_y = (int)5/3
осталось выкинуть лишние ячейки
рисуй любую ячейку которая не в 'cells' кроме минимального значения cells