powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка про остров
25 сообщений из 421, страница 5 из 17
Задачка про остров
    #39925202
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник

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"
}

Я сначала тоже стал заполнять шестисвязный список таким образом, но сразу понял что это полный мрак и можно сделать кучу ошибок, взял массив предложенный майтоном и залил с него циклами, к тому же у тебя нет высот (весов) нод.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925205
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм поиска всех "замыканий" на уровне, в том числе множественных независимых есть?

Что значит замыкания?

1. Первый проход. Определяем резервуары не связаные с морем (изолированные). Выроженный слоучай - тонкая стенка по краям острова, тогда все что внутри один большой резервуар не связанный с морем. То что внутри резервуара, определяется на вотором и последующих шагах в рекурсии.
Если ваш резервуар ЛЮБОЙ связан с морем - на одном из разрезов обязательно объявится картинка - связаны - бублика/изолированной фигуры , да хоть кляксы изолированной - не получится.

2. Рекурсией пускаем алгоритм на каждый из резервуаров, представив что этот резервуар и есть новое море, а все что внутри - острова с возможными лужами. Рекурсия нужна как раз для многовложенных случаев.

Я просто не знаю как прорисовать что я имею ввиду.

авторЯ сначала тоже стал заполнять шестисвязный список таким образом, но сразу понял что это полный мрак
угу. Я тоже как начал пытаться что-то придумать, понял что таким образом для 1000 скажем ячеек по 8 сторон - проще застрелиться будет. Как это автоматизировать, не придумал. Как раз сделал, может Майтон чего подскажет по переводу таких веще в графы более легким способом. Сдается мне что такого способа нет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925206
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой алгоритм не срабоает как мне кажется при подземных туннелях между лужами на разные уровни. Во всех остальных случаях должен сработать КМК,
...
Рейтинг: 0 / 0
Задачка про остров
    #39925207
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Хммм... Еще раз подумайте над моим алгоритмом, все учтено. И сосуды и прочее. Режем по слоям - где нет замкнутой фигуры - вода польется куда то еще.
Ров уровня 0 - будет резать люой бублик и в него уходить будет вода. Кляксу в кляке нарисуйте, соедините их рвом, алгоритм все равно сжует это и не поперхнется - бублики будут рисоваться на срезе рва (т.е. самой низкой точки берега рва)). Если их нет замкнутых - ваша вода утекла в море.
Чего уже проще - если фигура замкнута, никуда ничего из нее не потечет.
у тебя в принципе рабочий алгоритм, я полагаю что в каждом слое вполне можно определить замкнутые выбоины и посчитать их площадь, минусовав островки (но добавив озера в островах, и т.д.), только боюсь, для каждого слоя это будет трудоемкая операция порядка O(N), а слоёв может быть много.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925209
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Определяем резервуары не связаные с морем (изолированные). ... То что внутри резервуара, определяется на вотором и последующих шагах в рекурсии.
собственно, это я и расписал тут в этапах 1-2
Имя пользователя1
соберу сюда свой вариант, основанный на идеях iOracleDev

этапы:

1) закрашиваем все ячейки, с которых вода сливается в море. Сначала все крайние, потом по принципу заражения - если у закрашенной клетки соседняя не ниже, то закрашиваем эту соседнюю. Похоже на волновой алгоритм, только "наизнанку".

2) Остались незакрашенные области - кандидаты в лужи. Обходим по краю, выясняем, где самая низкая стенка (высота Н). Оттуда начинаем закрашивать лужу, по соседним ячейкам, но только такие, которые ниже чем Н. Закрасили лужу, заодно посчитали объем, занесли в копилку. Всё, это отработанные клетки, если их засыпать песком до высоты Н, то они будут как клетки из п.1.

Если клетки данной лужи касаются незакрашенных на п.2, то те незакрашенные - остров или полуостров, работаем с ними по п.1. Иначе обрабатывает другую лужу, которая осталась.

таким образом мы последовательно добираемся до всех клеток.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925217
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. Сейчас на свежую голову прикинул. В принципе да... Твой тоже рабочий, но меня что-то смущает, не пойму что.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925222
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не. Ваш точно должен работать для определения главных луж на острове. Как ни крутил не придмал ситуации где не сработает.

PS Предлагаю все таки обсуждать на квадратно гнездовом (суть не меняется, а лишние детали отсекаются)

99999999
95553451
99967899
...
Рейтинг: 0 / 0
Задачка про остров
    #39925223
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1соберу сюда свой вариант, основанный на идеях iOracleDev

этапы:

1) закрашиваем все ячейки, с которых вода сливается в море. Сначала все крайние, потом по принципу заражения - если у закрашенной клетки соседняя не ниже, то закрашиваем эту соседнюю. Похоже на волновой алгоритм, только "наизнанку".

2) Остались незакрашенные области - кандидаты в лужи. Обходим по краю, выясняем, где самая низкая стенка (высота Н). Оттуда начинаем закрашивать лужу, по соседним ячейкам, но только такие, которые ниже чем Н. Закрасили лужу, заодно посчитали объем, занесли в копилку. Всё, это отработанные клетки, если их засыпать песком до высоты Н, то они будут как клетки из п.1.

Если клетки данной лужи касаются незакрашенных на п.2, то те незакрашенные - остров или полуостров, работаем с ними по п.1. Иначе обрабатывает другую лужу, которая осталась.

таким образом мы последовательно добираемся до всех клеток.


До кодинга руки не дошли, изображу схематично)

0) Рис. 1 - исходная позиция.

1) Рис. 2 - этапом 1, от краев, закрасили в зеленый все клетки, с которых вода сливается. Остались незакрашенные области (иначе выход). И у нас на руках есть граничные ячейки.

2) Рис. 3 - берем область, обходим по периметру, находим самую низкую точку ограды, у неё высота h

3) Рис. 4 - от этой точки закрашиваем те ранее незакрашенные клетки, у которых высота меньше или равна h. С каждой ячейки добавляем в копилку разницу (h - h(ячейки)).
Закрасили лужу, вышли к острову, и к тем коричневым областям, с которых вода сливается в эту лужу, и начинаем с ними работать как с береговыми ячейками на старте.

----
закрашивание плоскости - "поиск в ширину", выглядит как распространение огня.
обход береговой линии в поисках красной точки - тоже понятно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925224
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Что значит замыкания?

Замкнутые контуры, ноды граничащие с внутренним контуром "замыкания" ниже нод "замыкания".

АСУ ТПшник
Я просто не знаю как прорисовать что я имею ввиду.






...
Рейтинг: 0 / 0
Задачка про остров
    #39925228
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

Идти также как идет отлив, т.е. сверху практичнее будет, каждый шаг от воды освобождается новый ярус, вопрос как найти все замкнутые контуры на ярусе.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925232
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с алгоритмом ТС, в таком разрезе он не сложен, будет работать. Как бы в двухмерном мире весь анализ для каждого шага алгоритма.
Аплодирую.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925233
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представим себе, что в каждом ярусе есть ложбинка в которой будет оставаться вода, причем не обязательно замкнутая по всему ярусу, а наверху центральная лужа из которой есть множетственные выступы
...
Рейтинг: 0 / 0
Задачка про остров
    #39925234
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте усложним задачу.

Изначально остров - сухой.

Прилив - поднимается до высоты заданной height.
Потом - отлив. И надо посчитать какие кратеры и полыньи останутся заполнены.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925237
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Мы эту задачу и решаем, какие плитки отсанутся сухими, какие затопленными, неполное затопление частный случай, мы еще не решили в виде пригодном для реализации базовую задачу.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925238
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Представим себе, что в каждом ярусе есть ложбинка в которой будет оставаться вода, причем не обязательно замкнутая по всему ярусу, а наверху центральная лужа из которой есть множетственные выступы
ну вот на Рис. 4 мы как раз добрались до такого островка. И теперь работаем с ним как с исходным островом. Та самая рекурсия, о которой ты говорил.

Главное, ничего не надо искать. Вся закраска начинается от краёв и переходит ТОЛЬКО на соседние клетки.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925239
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте усложним задачу.

Изначально остров - сухой.

Прилив - поднимается до высоты заданной height.
Потом - отлив. И надо посчитать какие кратеры и полыньи останутся заполнены.
тот же способ 22077648
только останавливаемся в закраске, если наткнулись на ячейку, которая высокая и не скроется приливом. Тут без разницы. Поиск в ширину зайдет куда угодно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925246
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считаю что задачу на correctness мы уже решили. Она не очень сложная.

Давайте на performance. И уйдем от hex-представления в сторону декартова.

Какие-бы алгоритмы мы не придумывали всё равно мы оперируем ячейкой (Cell) и ее соседями (Neigbours).

Тогда базовым элементом вашего алгоритма будет

Код: sql
1.
2.
3.
4.
5.
6.
7.
interface ICell {

  int getHeight();
  int getWaterLine();
  ICell<Iterable> neighbours();

}



Для hex-поля количество соседей будет 6. Для пиксельного рисунка что приведен выше - 4.

Далее. Тестовые данные. Предлагаю искать картинки с т.н. "картами высот"

Их полно в интернетах. Подойдут даже синтетически картики высот из игр. Нам нужен размер хотя-бы от 512х512 пикселов.
На картинке должна быть гора или остров с кратерами.

Можно брать и ямку но тогда неочевидно будет откуда пойдет океан. Я предполагаю что с краёв картинки.

Заодно протестируем рекурсию и потенциальный stackoveflow если таковой вы туда захардкодили.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925249
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

я правильно понимаю, что если у ячейки все 4 соседей выше, то вода не выливается? т.е. касание углов плотное и задерживает воду
...
Рейтинг: 0 / 0
Задачка про остров
    #39925256
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квадратная сетка. Пиксели. 4 соседа. 4х связность. Некуда воде выливаться. Все четко.

Ну и треугольная сетка - 3 соседа.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925258
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот образец карты высот. Светлые пиксели - высота выше. Темны - ниже.
Где-то в центре картинки находится вершина горы.

Для удобства - картинку можно смасштабировать чуть поменьше.

...
Рейтинг: 0 / 0
Задачка про остров
    #39925263
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы затестить алгоритм, нужны не только данные, но и правильные ответы для них
...
Рейтинг: 0 / 0
Задачка про остров
    #39925265
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что разве в топике еще не решили?
...
Рейтинг: 0 / 0
Задачка про остров
    #39925369
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду наблюдать за темой. Из чего-то осязаемого, потенциально полезного, уплывает в стороны высоких материй, не имеющих "практического" применения.

Есть более приземленная задача (она как бы сплав задач на самом деле, но остальные в силу специфики - нудно и бесполезно объяснять).

По идее тоже теория графов.

Итак.
Дано: резервуарный парк , скажем 200 разного номинала резервуаров с разными продуктами.
Они обвязаны задвижками, насосами, флажками блокировки (насос сломан, задвижка не может быть открыта).
Куча хитросплетений труб между собой.

Задача - написать алгоритм поиска пути для перекачки между двумя резервуарами. Т.е. нужно чтобы путь обязательно проходил через насос и не перекрывал другие открытые пути (параллельная перекачка многих).

С виду - алгоритм А* использовать и не парится. Узлы графа могут уметь состояния и так далее (проходной не проходной в данный момент) - качаем по кратчайшему пути через мощнейший насос при прочих равных.

Хитрость в том, чтобы минимизировать смешение продуктов (т.е. не использовать насос скажем для ДТ а в следующий момент для бензина - только в крайних случаях).
...
Рейтинг: 0 / 0
Задачка про остров
    #39925376
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник,

хорошо бы простенький пример, где все нюансы проявятся.

и расставить приоритеты, например, что хуже - пустить через более слабый насос, через более длинный путь, или со смешиванием продуктов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925379
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник,

Вроде такие задачи решаются вот этим инструментом - Динамическое программирование , будущим АСУ ТПшникам в вузах точно преподается))
...
Рейтинг: 0 / 0
25 сообщений из 421, страница 5 из 17
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка про остров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]