Из шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.
Выпиленные клетки задаются в ячейках A1:An, записью от a1 до h8 (строчная латинская буква совместно с цифрой), при этом заполнено столько ячеек сколько выпиливается клеток.
Пример 1. Если в ячейках A1:A3 указаны следующие клетки: A1: a1 A2: a2 A3: b1 Результат формулы должен быть равен 8
Пример 2. A1: a1 A2: a2 A3: b1 A4: b2 Результат - 8
Пример 3. A1: h8 Результат - 4
Пример 4: в A1:A15: a1, a2, a3, a4, a5, a6, a7, a8, b1, c1, d1, e1, f1, g1, h1 Результат - 32
Задачу можно решить как макросом, так и формулой, Для меня формулой интереснее
Из шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.
Выпиленные клетки задаются в ячейках A1:An, записью от a1 до h8 (строчная латинская буква совместно с цифрой), при этом заполнено столько ячеек сколько выпиливается клеток.
Пример 1. Если в ячейках A1:A3 указаны следующие клетки: A1: a1 A2: a2 A3: b1 Результат формулы должен быть равен 8
Пример 2. A1: a1 A2: a2 A3: b1 A4: b2 Результат - 8
Пример 3. A1: h8 Результат - 4
Пример 4: в A1:A15: a1, a2, a3, a4, a5, a6, a7, a8, b1, c1, d1, e1, f1, g1, h1 Результат - 32
Задачу можно решить как макросом, так и формулой, Для меня формулой интереснееMCH
Сообщение отредактировал MCH - Среда, 14.11.2012, 15:04
до 19 наверно не успею, дай срок до 20:00 Я ведь как в четверг до 158 ужал больше над задачей не думал То что Константин замутил пока не понятно, но вроде считает правильно, в этом направлении не буду думать Формулу в 138 можно на символ сократить, вместо &"00" можно написать &0&0
до 19 наверно не успею, дай срок до 20:00 Я ведь как в четверг до 158 ужал больше над задачей не думал То что Константин замутил пока не понятно, но вроде считает правильно, в этом направлении не буду думать Формулу в 138 можно на символ сократить, вместо &"00" можно написать &0&0
[/vba] Формула основана на том же принципе, что и предыдущие
Для начала легче объяснить формулу из 17 поста в 158 знаков СЧЕТЗ - считаем кол-во заполненных ячеек и умножаем на 4, т.е. считаем максимальное кол-во возможных границ Затем вычитаем количество границ, которые отсутствуют, т.е. находятся между заполненными ячейками, для этого определяем количестово рядом стоящих заполненных ячеек по горизонтали и по вертикали и умножаем на 2
Формируем вертикальный массив из 64 элементов : a1, a2,a3 ... h6, h7, h8 (кстати в формуле была ошибка, вместо диапазона 8:73 нужно было указывать 8:71, но на результаты это не повлияло) с помощьюСЧЕТЕСЛИ считаем есть ли полученные клетки (от a1 до h8) в столбце A Также формируем двойной массив со смещением вниз и со смещением вправо, {"a2";"b1":"a3";"b2": ... :"h8";"i7":"h9";"i8"}, при перемножении двух массивов и проссумировав результат получаем количество пар заполненных рядомстоящих ячеек (вертикально или горизонтально)
Формула в 146, из 23 поста: Примерно тоже самое, для формирования массива "A1" ... "H8" использовал функцию АДРЕС вместо СИМВОЛ общее кол-во ячеек не считал, а считал сколько раз происходит переход с заполненной ячейки на незаполненную (также вертикально и горизонтально) и умножел полученное кол-во на 2 По такому же принципу работает и UDF
ну и текущая формула в 128 символов Формируем три массива от A1 до H8 в трех вариантах, без смещения, со смещением на клетку вправо и со смещением на клетку вниз. С помощью МУМНОЖ получаем вертикальный массив, при этом каждый подмассив имеет свой вес, без смещения - 4, вниз и вправо - 2 и 1 Таким образом если клетка заполнена, а снизу и справа не заполнена , то результат будет 4 и кол-во границ должно быть 4, если клетка заполнени, a рядом заполнена только одна клетка (либо сверху либо снизу) то результат будет 5 или 6 и кол-во границ нужно считать - 2, во всех остальных случаях кол-во границ - 0. Кол-во границ после МУМНОЖ определяем через ПРОСМОТР как то так, надеюсь понятно объяснил
[/vba] Формула основана на том же принципе, что и предыдущие
Для начала легче объяснить формулу из 17 поста в 158 знаков СЧЕТЗ - считаем кол-во заполненных ячеек и умножаем на 4, т.е. считаем максимальное кол-во возможных границ Затем вычитаем количество границ, которые отсутствуют, т.е. находятся между заполненными ячейками, для этого определяем количестово рядом стоящих заполненных ячеек по горизонтали и по вертикали и умножаем на 2
Формируем вертикальный массив из 64 элементов : a1, a2,a3 ... h6, h7, h8 (кстати в формуле была ошибка, вместо диапазона 8:73 нужно было указывать 8:71, но на результаты это не повлияло) с помощьюСЧЕТЕСЛИ считаем есть ли полученные клетки (от a1 до h8) в столбце A Также формируем двойной массив со смещением вниз и со смещением вправо, {"a2";"b1":"a3";"b2": ... :"h8";"i7":"h9";"i8"}, при перемножении двух массивов и проссумировав результат получаем количество пар заполненных рядомстоящих ячеек (вертикально или горизонтально)
Формула в 146, из 23 поста: Примерно тоже самое, для формирования массива "A1" ... "H8" использовал функцию АДРЕС вместо СИМВОЛ общее кол-во ячеек не считал, а считал сколько раз происходит переход с заполненной ячейки на незаполненную (также вертикально и горизонтально) и умножел полученное кол-во на 2 По такому же принципу работает и UDF
ну и текущая формула в 128 символов Формируем три массива от A1 до H8 в трех вариантах, без смещения, со смещением на клетку вправо и со смещением на клетку вниз. С помощью МУМНОЖ получаем вертикальный массив, при этом каждый подмассив имеет свой вес, без смещения - 4, вниз и вправо - 2 и 1 Таким образом если клетка заполнена, а снизу и справа не заполнена , то результат будет 4 и кол-во границ должно быть 4, если клетка заполнени, a рядом заполнена только одна клетка (либо сверху либо снизу) то результат будет 5 или 6 и кол-во границ нужно считать - 2, во всех остальных случаях кол-во границ - 0. Кол-во границ после МУМНОЖ определяем через ПРОСМОТР как то так, надеюсь понятно объяснилMCH
Сообщение отредактировал MCH - Воскресенье, 18.11.2012, 21:29
Сергей, твоя формула не будет работать в 2003 из за указания целых диапазонов A:A Если указать, A1:A64, то это приведет к увеличению на 12 символов, но для 2007/2010 ее можно сократить до 120 символов: [vba]
Сергей, твоя формула не будет работать в 2003 из за указания целых диапазонов A:A Если указать, A1:A64, то это приведет к увеличению на 12 символов, но для 2007/2010 ее можно сократить до 120 символов: [vba]
Моя "формула" - самая длинючая - 419 знаков (без пробелов) . Создаю из адресов "вырезаемых ячеек" диапазон "шахматнойфигуры". Число вертикальных границ = (число областей пересечения этого диапазона и строк листа)*2, число горизонтальных границ = (число областей пересечения диапазона и столбцов листа)*2. [vba]
Code
Function PerimeterOf(ChessCells As Range) Dim Chessman As Range, XRng As Range, Cell As Variant, K As Long, P As Double ' Set Chessman = Cells(9, 9) On Error Resume Next For Each Cell In ChessCells.Value Set Chessman = Union(Chessman, Range(Cell)) Next On Error GoTo 0 For K = 1 To 8 Set XRng = Intersect(Rows(K), Chessman) If Not XRng Is Nothing Then P = P + XRng.Areas.Count Set XRng = Intersect(Columns(K), Chessman) If Not XRng Is Nothing Then P = P + XRng.Areas.Count Next PerimeterOf = P * 2 End Function
[/vba]
Моя "формула" - самая длинючая - 419 знаков (без пробелов) . Создаю из адресов "вырезаемых ячеек" диапазон "шахматнойфигуры". Число вертикальных границ = (число областей пересечения этого диапазона и строк листа)*2, число горизонтальных границ = (число областей пересечения диапазона и столбцов листа)*2. [vba]
Code
Function PerimeterOf(ChessCells As Range) Dim Chessman As Range, XRng As Range, Cell As Variant, K As Long, P As Double ' Set Chessman = Cells(9, 9) On Error Resume Next For Each Cell In ChessCells.Value Set Chessman = Union(Chessman, Range(Cell)) Next On Error GoTo 0 For K = 1 To 8 Set XRng = Intersect(Rows(K), Chessman) If Not XRng Is Nothing Then P = P + XRng.Areas.Count Set XRng = Intersect(Columns(K), Chessman) If Not XRng Is Nothing Then P = P + XRng.Areas.Count Next PerimeterOf = P * 2 End Function
Я только вздохнул. Алгоритм родился сразу: определить числа "задвоенных" границ ячеек (где контактируют вырезанные ячейки). До формулы дело не дошло... Некогда...
Я только вздохнул. Алгоритм родился сразу: определить числа "задвоенных" границ ячеек (где контактируют вырезанные ячейки). До формулы дело не дошло... Некогда...vikttur