- 4,045
- 63
- 645
Всем привет! Давненько я тут не показывался, но вот появилась задачка, и решил наведаться. Может чего подскажете )
Сразу оговорюсь, задача не связана с майном, поэтому у меня есть весьма ограниченный инструментарий "программирования", примерно такой же, как если бы кто-то пытался написать свою игру в экселе )
Но вопрос, скорее не про само программирование, а про поиск подходящего алгоритма.
Суть задачи:
Есть поле из ячеек с данными размером 4х4 (или больше, или меньше, суть не в размере).
Нужно придумать алгоритм произвольного объединения этих ячеек, соблюдая при этом их прямоугольность. То есть объединённые ячейки не могут быть Г или П образными.
При этом ячейка, получившаяся после объединения, получает данные из самой левой и самой верхней из объединённых ячеек. Остальные данные скрываются. Грубо говоря, это практически эксель. Фишка только в том, что я не могу управлять им графически (мышкой). В моём распоряжении есть только набор параметров (это к разговору об инструментарии).
А это ещё одна из задач: добиться удобного управления процессом объединения.
Что я придумал на данный момент:
Самое подходящее, что удалось придумать - это индексы.
То есть, все ячейки нумеруются целыми числами. Если индексы соседних ячеек равны, они объединяются.
С точки зрения управления, это достаточно удобно.
Однако тут есть и свои подводные камни.
К примеру, что будет если индекс одной из ячеек равен индексу соседа справа и соседа снизу?
Что, по вашему, должно произойти с ячейкой
Логично, что её данные должны скрыться, так как объединёная ячейка под индексом
Финальная картина должна стать такой:
Для этого, я проверяю данные соседних ячеек (левой, верхней и ячейки, находящейся по диагонали), и, если они равны, скрываю ячейку
Но это просто только на первый взгляд, так как мы находимся у левого верхнего угла.
А теперь представьте, сколько проверок нужно сделать, чтобы определить, нужно ли скрывать ячейку
и такие:
И подобные проверки нужно сделать для каждой из ячеек.
А теперь зайдём с другого конца и попробуем объединить ячейки у нижнего правого угла:
Что произойдёт с ячейкой
А это означает, что проверки мне нужно делать не только для левых и верхних соседей, а ещё и для правых и нижних.
То есть, самый первый пример, где мы думали, что делать с ячейкой
Но даже и это не самое страшное. Даже если закрыть глаза на огромное количество проверок, остаются концептуальные проблемы.
А именно, что вы будете делать, к примеру, вот с таким полем?
Что произойдёт с ячейками
Вывод:
Либо придуманный принцип управления объединением не очень то и рабочий, либо я просто не знаю удобного алгоритма проверки всего поля.
Вопрос:
Знаете ли такой алгоритм вы? Или, может быть, сможете подсказать более удобный принцип управления? Такой, который бы исключал описанные проблемы. К примеру, что-то основанное на рядах и столбцах или ещё что-нибудь?
Сразу оговорюсь, задача не связана с майном, поэтому у меня есть весьма ограниченный инструментарий "программирования", примерно такой же, как если бы кто-то пытался написать свою игру в экселе )
Но вопрос, скорее не про само программирование, а про поиск подходящего алгоритма.
Суть задачи:
Есть поле из ячеек с данными размером 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
?Вывод:
Либо придуманный принцип управления объединением не очень то и рабочий, либо я просто не знаю удобного алгоритма проверки всего поля.
Вопрос:
Знаете ли такой алгоритм вы? Или, может быть, сможете подсказать более удобный принцип управления? Такой, который бы исключал описанные проблемы. К примеру, что-то основанное на рядах и столбцах или ещё что-нибудь?