Прошу прощения, не увидел что новый вопрос в МШ уже есть. Предлагаю свой перенести на следующую неделю.
Имеется поле 6Х6. На нём половина клеток 1, половина 0. Необходимо формулой определить все ли клетки 1 касаются друг друга боковыми сторонами. Т.е., если разрезать все грани между 1 и 0, будет ли это целый кусок. У меня с использованием дополнительных ячеек получилась протягиваемая массивная формула 174 символа и окончательное решение в результирующей ячейке 18 символов. Значение в результирующей ячейке может быть истина/ложь или число<>0/0 Ну и дополнительно формулы поворотов на правом зелёном поле, если кто-то заинтересуется. Или это можно вынести в отдельную тему. Над ними я особо не заморачивался.
Прошу прощения, не увидел что новый вопрос в МШ уже есть. Предлагаю свой перенести на следующую неделю.
Имеется поле 6Х6. На нём половина клеток 1, половина 0. Необходимо формулой определить все ли клетки 1 касаются друг друга боковыми сторонами. Т.е., если разрезать все грани между 1 и 0, будет ли это целый кусок. У меня с использованием дополнительных ячеек получилась протягиваемая массивная формула 174 символа и окончательное решение в результирующей ячейке 18 символов. Значение в результирующей ячейке может быть истина/ложь или число<>0/0 Ну и дополнительно формулы поворотов на правом зелёном поле, если кто-то заинтересуется. Или это можно вынести в отдельную тему. Над ними я особо не заморачивался.Светлый
Вопросы: 1. Условие, что половина "1" (18 штук) и половина "0" (тоже 18) - обязательное, т.е. не может такого быть, что 17 единиц и 19 нулей? 2. Исходные данные находятся в ячейках G1:L6? ссылаться нужно только на эти ячейки? 3. Нарисовано две фигуры, нужно выводить ЛОЖЬ? (в примере указана ИСТИНА) 4. Что за числа в ячейках N1:W8? какое они имеют отношение к задаче? и что за числа в D1:D2?
Вопросы: 1. Условие, что половина "1" (18 штук) и половина "0" (тоже 18) - обязательное, т.е. не может такого быть, что 17 единиц и 19 нулей? 2. Исходные данные находятся в ячейках G1:L6? ссылаться нужно только на эти ячейки? 3. Нарисовано две фигуры, нужно выводить ЛОЖЬ? (в примере указана ИСТИНА) 4. Что за числа в ячейках N1:W8? какое они имеют отношение к задаче? и что за числа в D1:D2?
MCH, отвечаю: 1. По условию головоломки, из которой я взял эту задачу, разрезание должно быть на две равные симметричные части. Но в принципе, формула должна работать для любого количества единиц. 2. Если по формуле потребуется использовать окружающие ячейки, то вполне допустимо, они нигде не используются. 3. Случайно сохранил не с тем числом и не проверил. В задании сказано, что и при каких условиях там должно быть. 4. В ячейках N1:W6 примеры правильных комбинаций с их зеркальными отражениями и поворотами, а в N7:N8 примеры, не удовлетворяющие условию. В D1:D2 индексы, чтобы из таблицы взять числа для заполнения образца. В образце стоят формулы, которые заполняют поле из выбранного числа в ячейке C1.
MCH, отвечаю: 1. По условию головоломки, из которой я взял эту задачу, разрезание должно быть на две равные симметричные части. Но в принципе, формула должна работать для любого количества единиц. 2. Если по формуле потребуется использовать окружающие ячейки, то вполне допустимо, они нигде не используются. 3. Случайно сохранил не с тем числом и не проверил. В задании сказано, что и при каких условиях там должно быть. 4. В ячейках N1:W6 примеры правильных комбинаций с их зеркальными отражениями и поворотами, а в N7:N8 примеры, не удовлетворяющие условию. В D1:D2 индексы, чтобы из таблицы взять числа для заполнения образца. В образце стоят формулы, которые заполняют поле из выбранного числа в ячейке C1.Светлый
Программировать проще, чем писать стихи.
Сообщение отредактировал Светлый - Воскресенье, 24.04.2016, 19:56
По своей сути задачу нужно решать с помощью VBA, либо "поиском в глубину" с помощью рекурсий (код я уже выкладывал), либо "поиском в ширину". На мой взгляд одной формулой задачу не решить, т.к. нужно использовать динамическое программирование.
Сделал решение с помощью формул, получилась не одна, а несколько разных формул, но все они достаточно компактные.
Способ решения (фактически волновой алгоритм или поиск в ширину): Находим первую клетку с единицей, от нее запускаем волну, пытаясь "закрасить" соседние заполненные клетки Если по истечению 35 итераций (достаточное количество для поля 6х6) количество "закрашенных" клеток равно общему кол-ву единиц, то на поле одна единственная фигура, если меньше, то фигур несколько
Решение выкладываю, кто хочет решить самостоятельно - не подглядывайте
По своей сути задачу нужно решать с помощью VBA, либо "поиском в глубину" с помощью рекурсий (код я уже выкладывал), либо "поиском в ширину". На мой взгляд одной формулой задачу не решить, т.к. нужно использовать динамическое программирование.
Сделал решение с помощью формул, получилась не одна, а несколько разных формул, но все они достаточно компактные.
Способ решения (фактически волновой алгоритм или поиск в ширину): Находим первую клетку с единицей, от нее запускаем волну, пытаясь "закрасить" соседние заполненные клетки Если по истечению 35 итераций (достаточное количество для поля 6х6) количество "закрашенных" клеток равно общему кол-ву единиц, то на поле одна единственная фигура, если меньше, то фигур несколько
Решение выкладываю, кто хочет решить самостоятельно - не подглядывайтеMCH
С итерациями меня категорически не устроило, они нужны были для других целей. Пришлось решать формулами. Основная, протянутая на 18 ячеек 174 167 символа и значение последней ячейки не равное 0, как условие связности. Может быть гуру форума имеют в заначке какие-нибудь функции или приёмы, способные решить эту задачу? Я долго ломал голову, но по другому не смог решить.
Кстати, в загруженном файле есть ошибки. Выдаёт ЛОЖЬ для правильных вариантов. (4096 и 4160)
С итерациями меня категорически не устроило, они нужны были для других целей. Пришлось решать формулами. Основная, протянутая на 18 ячеек 174 167 символа и значение последней ячейки не равное 0, как условие связности. Может быть гуру форума имеют в заначке какие-нибудь функции или приёмы, способные решить эту задачу? Я долго ломал голову, но по другому не смог решить.
Кстати, в загруженном файле есть ошибки. Выдаёт ЛОЖЬ для правильных вариантов. (4096 и 4160)Светлый
Программировать проще, чем писать стихи.
Сообщение отредактировал Светлый - Понедельник, 25.04.2016, 20:27
Пока не могу придумать другой алгоритм. Можно попробовать 36 значений 1/0 запихнуть в одну ячейку в виде числа (сумма степеней двойки). Но кроме компактности решения ничего полезного не получится, а формулы могут увеличиться в разы
Нужно менять алгоритм, идей никаких нет.
Пока не могу придумать другой алгоритм. Можно попробовать 36 значений 1/0 запихнуть в одну ячейку в виде числа (сумма степеней двойки). Но кроме компактности решения ничего полезного не получится, а формулы могут увеличиться в разы
Думал я над подобными вариантами. У меня из числа так поле и заполняется. Правда для задачи было достаточно 2^18. Остальные заполняются поворотом этих 18. Но для МШ надо всё поле. Моя формула будет работать и для поля 8Х8, только исправить диапазоны и константы. Тогда 2^64 уже будет проблемой. Excel позволит только 2^49 обрабатывать. Дальше уже округляет. Лучше работать напрямую с полем. И выделение элементов проще, и поле можно заполнить любым способом.
Думал я над подобными вариантами. У меня из числа так поле и заполняется. Правда для задачи было достаточно 2^18. Остальные заполняются поворотом этих 18. Но для МШ надо всё поле. Моя формула будет работать и для поля 8Х8, только исправить диапазоны и константы. Тогда 2^64 уже будет проблемой. Excel позволит только 2^49 обрабатывать. Дальше уже округляет. Лучше работать напрямую с полем. И выделение элементов проще, и поле можно заполнить любым способом.Светлый
Лучше работать напрямую с полем. И выделение элементов проще, и поле можно заполнить любым способом.
Ну так у меня оба решения (и UDF и формулы) работают изначально ссылаясь на исходное поле. Размер самого поля может быть любым, нет ограничения на размер, фигуры также могут быть любыми (не обязательно симметричными) Если посмотреть на формульное решение, то формулы достаточно простые, а решение макросом - в 2-3 десятка строчек кода.
Лучше работать напрямую с полем. И выделение элементов проще, и поле можно заполнить любым способом.
Ну так у меня оба решения (и UDF и формулы) работают изначально ссылаясь на исходное поле. Размер самого поля может быть любым, нет ограничения на размер, фигуры также могут быть любыми (не обязательно симметричными) Если посмотреть на формульное решение, то формулы достаточно простые, а решение макросом - в 2-3 десятка строчек кода.MCH
Судя по соседней теме выделения 6 цифр, на данном временном промежутке желающих решить задачу не появится. Но предлагаю дать неделю на проработку. Возможно, в праздничные дни кто-то предпочтёт пиву мозговую деятельность. Или хотя бы совместит. Найдутся желающие? Вскроюсь числа восьмого?
[offtop]С праздниками всех!
Судя по соседней теме выделения 6 цифр, на данном временном промежутке желающих решить задачу не появится. Но предлагаю дать неделю на проработку. Возможно, в праздничные дни кто-то предпочтёт пиву мозговую деятельность. Или хотя бы совместит. Найдутся желающие? Вскроюсь числа восьмого?
Все четыре примера дадут ЛОЖЬ, потому что на них по несколько связных областей, но между собой они разрозненные. Самый простой пример это половина доски, все единицы касаются друг друга боковыми сторонами. Есть СВЯ'ЗНЫЕ пространства и области, а есть СВЯЗАННЫЕ. В интернете можно найти определения.
Все четыре примера дадут ЛОЖЬ, потому что на них по несколько связных областей, но между собой они разрозненные. Самый простой пример это половина доски, все единицы касаются друг друга боковыми сторонами. Есть СВЯ'ЗНЫЕ пространства и области, а есть СВЯЗАННЫЕ. В интернете можно найти определения.Светлый