|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник digraph G { "aa"->"ab" "aa"->"ba" "aa"->"bb" "ab"->"bb" "ab"->"bc" "ab"->"ac" "ac"->"bc" "ac"->"bd" "ba"->"ca" "ba"->"cb" "ba"->"bb" "bb"->"cb" "bb"->"cc" "bb"->"bc" "bc"->"cc" "bc"->"cd" "bc"->"bd" "bd"->"cd" "bd"->"ce" "ca"->"cb" "cb"->"cc" "cb"->"da" "cb"->"db" "cc"->"dc" "cc"->"db" "cc"->"cd" "cd"->"de" "cd"->"ce" "cd"->"dc" "da"->"db" "da"->"ea" "db"->"ea" "db"->"eb" "db"->"dc" "dc"->"de" "dc"->"eb" "dc"->"ec" "ea"->"eb" "eb"->"ec" "de"->"ec" "ce"->"de" "ca"->"da" } Я сначала тоже стал заполнять шестисвязный список таким образом, но сразу понял что это полный мрак и можно сделать кучу ошибок, взял массив предложенный майтоном и залил с него циклами, к тому же у тебя нет высот (весов) нод. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:10 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Алгоритм поиска всех "замыканий" на уровне, в том числе множественных независимых есть? Что значит замыкания? 1. Первый проход. Определяем резервуары не связаные с морем (изолированные). Выроженный слоучай - тонкая стенка по краям острова, тогда все что внутри один большой резервуар не связанный с морем. То что внутри резервуара, определяется на вотором и последующих шагах в рекурсии. Если ваш резервуар ЛЮБОЙ связан с морем - на одном из разрезов обязательно объявится картинка - связаны - бублика/изолированной фигуры , да хоть кляксы изолированной - не получится. 2. Рекурсией пускаем алгоритм на каждый из резервуаров, представив что этот резервуар и есть новое море, а все что внутри - острова с возможными лужами. Рекурсия нужна как раз для многовложенных случаев. Я просто не знаю как прорисовать что я имею ввиду. авторЯ сначала тоже стал заполнять шестисвязный список таким образом, но сразу понял что это полный мрак угу. Я тоже как начал пытаться что-то придумать, понял что таким образом для 1000 скажем ячеек по 8 сторон - проще застрелиться будет. Как это автоматизировать, не придумал. Как раз сделал, может Майтон чего подскажет по переводу таких веще в графы более легким способом. Сдается мне что такого способа нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:20 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Мой алгоритм не срабоает как мне кажется при подземных туннелях между лужами на разные уровни. Во всех остальных случаях должен сработать КМК, ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:24 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник Хммм... Еще раз подумайте над моим алгоритмом, все учтено. И сосуды и прочее. Режем по слоям - где нет замкнутой фигуры - вода польется куда то еще. Ров уровня 0 - будет резать люой бублик и в него уходить будет вода. Кляксу в кляке нарисуйте, соедините их рвом, алгоритм все равно сжует это и не поперхнется - бублики будут рисоваться на срезе рва (т.е. самой низкой точки берега рва)). Если их нет замкнутых - ваша вода утекла в море. Чего уже проще - если фигура замкнута, никуда ничего из нее не потечет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:25 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник Определяем резервуары не связаные с морем (изолированные). ... То что внутри резервуара, определяется на вотором и последующих шагах в рекурсии. Имя пользователя1 соберу сюда свой вариант, основанный на идеях iOracleDev этапы: 1) закрашиваем все ячейки, с которых вода сливается в море. Сначала все крайние, потом по принципу заражения - если у закрашенной клетки соседняя не ниже, то закрашиваем эту соседнюю. Похоже на волновой алгоритм, только "наизнанку". 2) Остались незакрашенные области - кандидаты в лужи. Обходим по краю, выясняем, где самая низкая стенка (высота Н). Оттуда начинаем закрашивать лужу, по соседним ячейкам, но только такие, которые ниже чем Н. Закрасили лужу, заодно посчитали объем, занесли в копилку. Всё, это отработанные клетки, если их засыпать песком до высоты Н, то они будут как клетки из п.1. Если клетки данной лужи касаются незакрашенных на п.2, то те незакрашенные - остров или полуостров, работаем с ними по п.1. Иначе обрабатывает другую лужу, которая осталась. таким образом мы последовательно добираемся до всех клеток. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:27 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Хм. Сейчас на свежую голову прикинул. В принципе да... Твой тоже рабочий, но меня что-то смущает, не пойму что. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:34 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Не. Ваш точно должен работать для определения главных луж на острове. Как ни крутил не придмал ситуации где не сработает. PS Предлагаю все таки обсуждать на квадратно гнездовом (суть не меняется, а лишние детали отсекаются) 99999999 95553451 99967899 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:48 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Имя пользователя1соберу сюда свой вариант, основанный на идеях iOracleDev этапы: 1) закрашиваем все ячейки, с которых вода сливается в море. Сначала все крайние, потом по принципу заражения - если у закрашенной клетки соседняя не ниже, то закрашиваем эту соседнюю. Похоже на волновой алгоритм, только "наизнанку". 2) Остались незакрашенные области - кандидаты в лужи. Обходим по краю, выясняем, где самая низкая стенка (высота Н). Оттуда начинаем закрашивать лужу, по соседним ячейкам, но только такие, которые ниже чем Н. Закрасили лужу, заодно посчитали объем, занесли в копилку. Всё, это отработанные клетки, если их засыпать песком до высоты Н, то они будут как клетки из п.1. Если клетки данной лужи касаются незакрашенных на п.2, то те незакрашенные - остров или полуостров, работаем с ними по п.1. Иначе обрабатывает другую лужу, которая осталась. таким образом мы последовательно добираемся до всех клеток. До кодинга руки не дошли, изображу схематично) 0) Рис. 1 - исходная позиция. 1) Рис. 2 - этапом 1, от краев, закрасили в зеленый все клетки, с которых вода сливается. Остались незакрашенные области (иначе выход). И у нас на руках есть граничные ячейки. 2) Рис. 3 - берем область, обходим по периметру, находим самую низкую точку ограды, у неё высота h 3) Рис. 4 - от этой точки закрашиваем те ранее незакрашенные клетки, у которых высота меньше или равна h. С каждой ячейки добавляем в копилку разницу (h - h(ячейки)). Закрасили лужу, вышли к острову, и к тем коричневым областям, с которых вода сливается в эту лужу, и начинаем с ними работать как с береговыми ячейками на старте. ---- закрашивание плоскости - "поиск в ширину", выглядит как распространение огня. обход береговой линии в поисках красной точки - тоже понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:49 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник Что значит замыкания? Замкнутые контуры, ноды граничащие с внутренним контуром "замыкания" ниже нод "замыкания". АСУ ТПшник Я просто не знаю как прорисовать что я имею ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:49 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Имя пользователя1, Идти также как идет отлив, т.е. сверху практичнее будет, каждый шаг от воды освобождается новый ярус, вопрос как найти все замкнутые контуры на ярусе. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 14:53 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Согласен с алгоритмом ТС, в таком разрезе он не сложен, будет работать. Как бы в двухмерном мире весь анализ для каждого шага алгоритма. Аплодирую. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:02 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Представим себе, что в каждом ярусе есть ложбинка в которой будет оставаться вода, причем не обязательно замкнутая по всему ярусу, а наверху центральная лужа из которой есть множетственные выступы ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:02 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Давайте усложним задачу. Изначально остров - сухой. Прилив - поднимается до высоты заданной height. Потом - отлив. И надо посчитать какие кратеры и полыньи останутся заполнены. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:04 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
mayton, Мы эту задачу и решаем, какие плитки отсанутся сухими, какие затопленными, неполное затопление частный случай, мы еще не решили в виде пригодном для реализации базовую задачу. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:07 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
iOracleDev Представим себе, что в каждом ярусе есть ложбинка в которой будет оставаться вода, причем не обязательно замкнутая по всему ярусу, а наверху центральная лужа из которой есть множетственные выступы Главное, ничего не надо искать. Вся закраска начинается от краёв и переходит ТОЛЬКО на соседние клетки. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:10 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
mayton Давайте усложним задачу. Изначально остров - сухой. Прилив - поднимается до высоты заданной height. Потом - отлив. И надо посчитать какие кратеры и полыньи останутся заполнены. только останавливаемся в закраске, если наткнулись на ячейку, которая высокая и не скроется приливом. Тут без разницы. Поиск в ширину зайдет куда угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:13 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Считаю что задачу на correctness мы уже решили. Она не очень сложная. Давайте на performance. И уйдем от hex-представления в сторону декартова. Какие-бы алгоритмы мы не придумывали всё равно мы оперируем ячейкой (Cell) и ее соседями (Neigbours). Тогда базовым элементом вашего алгоритма будет Код: sql 1. 2. 3. 4. 5. 6. 7.
Для hex-поля количество соседей будет 6. Для пиксельного рисунка что приведен выше - 4. Далее. Тестовые данные. Предлагаю искать картинки с т.н. "картами высот" Их полно в интернетах. Подойдут даже синтетически картики высот из игр. Нам нужен размер хотя-бы от 512х512 пикселов. На картинке должна быть гора или остров с кратерами. Можно брать и ямку но тогда неочевидно будет откуда пойдет океан. Я предполагаю что с краёв картинки. Заодно протестируем рекурсию и потенциальный stackoveflow если таковой вы туда захардкодили. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:31 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
mayton, я правильно понимаю, что если у ячейки все 4 соседей выше, то вода не выливается? т.е. касание углов плотное и задерживает воду ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:35 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Квадратная сетка. Пиксели. 4 соседа. 4х связность. Некуда воде выливаться. Все четко. Ну и треугольная сетка - 3 соседа. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:44 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Вот образец карты высот. Светлые пиксели - высота выше. Темны - ниже. Где-то в центре картинки находится вершина горы. Для удобства - картинку можно смасштабировать чуть поменьше. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 15:46 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
чтобы затестить алгоритм, нужны не только данные, но и правильные ответы для них ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 16:02 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
А что разве в топике еще не решили? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 16:12 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
Буду наблюдать за темой. Из чего-то осязаемого, потенциально полезного, уплывает в стороны высоких материй, не имеющих "практического" применения. Есть более приземленная задача (она как бы сплав задач на самом деле, но остальные в силу специфики - нудно и бесполезно объяснять). По идее тоже теория графов. Итак. Дано: резервуарный парк , скажем 200 разного номинала резервуаров с разными продуктами. Они обвязаны задвижками, насосами, флажками блокировки (насос сломан, задвижка не может быть открыта). Куча хитросплетений труб между собой. Задача - написать алгоритм поиска пути для перекачки между двумя резервуарами. Т.е. нужно чтобы путь обязательно проходил через насос и не перекрывал другие открытые пути (параллельная перекачка многих). С виду - алгоритм А* использовать и не парится. Узлы графа могут уметь состояния и так далее (проходной не проходной в данный момент) - качаем по кратчайшему пути через мощнейший насос при прочих равных. Хитрость в том, чтобы минимизировать смешение продуктов (т.е. не использовать насос скажем для ДТ а в следующий момент для бензина - только в крайних случаях). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 18:40 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник, хорошо бы простенький пример, где все нюансы проявятся. и расставить приоритеты, например, что хуже - пустить через более слабый насос, через более длинный путь, или со смешиванием продуктов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 19:25 |
|
Задачка про остров
|
|||
---|---|---|---|
#18+
АСУ ТПшник, Вроде такие задачи решаются вот этим инструментом - Динамическое программирование , будущим АСУ ТПшникам в вузах точно преподается)) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2020, 19:36 |
|
|
start [/forum/topic.php?fid=16&msg=39925379&tid=1339799]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 41ms |
total: | 281ms |
0 / 0 |