Объединение ячеек

4,045
63
645
Всем привет! Давненько я тут не показывался, но вот появилась задачка, и решил наведаться. Может чего подскажете )

Сразу оговорюсь, задача не связана с майном, поэтому у меня есть весьма ограниченный инструментарий "программирования", примерно такой же, как если бы кто-то пытался написать свою игру в экселе )

Но вопрос, скорее не про само программирование, а про поиск подходящего алгоритма.

Суть задачи:
Есть поле из ячеек с данными размером 4х4 (или больше, или меньше, суть не в размере).
Нужно придумать алгоритм произвольного объединения этих ячеек, соблюдая при этом их прямоугольность. То есть объединённые ячейки не могут быть Г или П образными.
При этом ячейка, получившаяся после объединения, получает данные из самой левой и самой верхней из объединённых ячеек. Остальные данные скрываются. Грубо говоря, это практически эксель. Фишка только в том, что я не могу управлять им графически (мышкой). В моём распоряжении есть только набор параметров (это к разговору об инструментарии).
А это ещё одна из задач: добиться удобного управления процессом объединения.

Что я придумал на данный момент:
Самое подходящее, что удалось придумать - это индексы.
То есть, все ячейки нумеруются целыми числами. Если индексы соседних ячеек равны, они объединяются.
С точки зрения управления, это достаточно удобно.
Однако тут есть и свои подводные камни.

К примеру, что будет если индекс одной из ячеек равен индексу соседа справа и соседа снизу?
Код:
 1  1  3  4
 1  6  7  8
 9 10 11 12
13 14 15 16

Что, по вашему, должно произойти с ячейкой 6?
Логично, что её данные должны скрыться, так как объединёная ячейка под индексом 1 должна быть прямоугольной.
Финальная картина должна стать такой:
Код:
 1  1  3  4
 1  1  7  8
 9 10 11 12
13 14 15 16

Для этого, я проверяю данные соседних ячеек (левой, верхней и ячейки, находящейся по диагонали), и, если они равны, скрываю ячейку 6, а объединённую ячейку растягиваю.
Но это просто только на первый взгляд, так как мы находимся у левого верхнего угла.
А теперь представьте, сколько проверок нужно сделать, чтобы определить, нужно ли скрывать ячейку 16? Потому что могут быть и такие случаи:
Код:
 1  2  3  4
 5  6  7  8
 1  1  1  1
 1  1  1 16
и такие:
Код:
 1  1  1  1
 1  1  1  1
 1  1  1  1
 1  1  1 16
И подобные проверки нужно сделать для каждой из ячеек.

А теперь зайдём с другого конца и попробуем объединить ячейки у нижнего правого угла:
Код:
 1  2  3  4
 5  6  7  8
 9 10 11  1
13 14  1  1

Что произойдёт с ячейкой 16 даже трудно себе представить. Из какой ячейки должны прийти данные 12 или 15? По логике, данные должны прийти из ячейки 11, так как объединённые ячейки должны быть прямоугольными.
А это означает, что проверки мне нужно делать не только для левых и верхних соседей, а ещё и для правых и нижних.
То есть, самый первый пример, где мы думали, что делать с ячейкой 6, вовсе не самый простой, так как нужно проверить всё поле вплоть до ячейки 16.
Код:
 1  1  3  4
 1  6  7  8
 9 10 11 12
13 14 15 16

Но даже и это не самое страшное. Даже если закрыть глаза на огромное количество проверок, остаются концептуальные проблемы.
А именно, что вы будете делать, к примеру, вот с таким полем?
Код:
 1  1  1  4
 1  6  7  2
 9  2  2  2
13  2  2  2
Что произойдёт с ячейками 6 и 7?

Вывод:
Либо придуманный принцип управления объединением не очень то и рабочий, либо я просто не знаю удобного алгоритма проверки всего поля.

Вопрос:
Знаете ли такой алгоритм вы? Или, может быть, сможете подсказать более удобный принцип управления? Такой, который бы исключал описанные проблемы. К примеру, что-то основанное на рядах и столбцах или ещё что-нибудь?
 
Сверху