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