powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка про остров
421 сообщений из 421, показаны все 17 страниц
Задачка про остров
    #39924602
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В море находится шестиугольный остров, сотворенный из вертикальных 6-угольных плит, плотно подогнанных друг к другу. Площадь горизонтального сечения каждой плиты равна 1, а высота верхней грани над уровнем моря - некоторое целое число больше 0, отдельно указывается для каждой плиты (на рисунке обозначено цифрами). Есть массив со всеми высотами.

Во время прилива остров полностью уходит под воду. Найти суммарный объем воды, который останется в лужах на острове, после отлива. На рисунке оный объем равен 3, вода останется в центральной ячейке и ячейке сверху-справа от неё.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924622
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ограничения на сложность или что-то типа есть? Можно просто решение в лоб:

0) Обозначем "плиты море" = 0
1) Для каждой плиты находим все возможные пути к морю (с условием a[n] > a[n+1]). Для каждой плиты сохраняем массив плит, которые участвовали в путях к морю
2) Находим локальные минумы
3) Для каждого локального минимум рекурсивно обходим его соседей с проверкой, находятся ли они в "чьем-то пути" из первого пункта. Если нет, то добавляем его в лужу.
4) В итоге в лужах находятся группы плит. У каждой лужы находим минимального соседа
5) Объем = Сумма всех групп по (минимальный сосед - высота плиты)
...
Рейтинг: 0 / 0
Задачка про остров
    #39924625
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan
Ограничения на сложность или что-то типа есть?
я сам пока не решил, не знаю.
ну а так - чем меньше, тем лучше)
...
Рейтинг: 0 / 0
Задачка про остров
    #39924630
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переусложним в первом решении, можно чуть проще:

0) Обозначем "плиты море" = 0
1) Для каждой плиты находим все возможные пути к морю (с условием a[n] > a[n+1]). Для каждой плиты сохраняем флаг "есть или нет выход к морю"
2) Находим локальные минумы
3) Для каждого локального минимум рекурсивно обходим его соседей с проверкой есть ли у него выход к морю. Если выхода к морю тоже нет, то добавляем эту плиту в лужу
4) В итоге в лужах находятся группы плит. У каждой лужы находим минимального соседа
5) Объем = Сумма всех групп по (минимальный сосед - высота плиты)
...
Рейтинг: 0 / 0
Задачка про остров
    #39924645
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нудно описывать исходные данные.

Обычно сотовый порядок узлов хорошо намапливается на матрицу где мы (условно) считаем каждую
ячейку 6 связной. Типа

Код: sql
1.
2.
3.
4.
5.
    o o
    |/
  o-o-o
   /|
  o o
...
Рейтинг: 0 / 0
Задачка про остров
    #39924654
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если для настоящей картинки (нужна матрица по трем линиям?):

рассуждения идут из центра
если по шести направлениям высоты выше, то "хорошо".
если по одному из направлений высота меньше, переходим на это направление.
и снова перебираем пять (или три) направлений.

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

Графы идут в самом конце по степени популярности использования.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924702
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Просто прогаммировать структуры данных с графами - нудотство.

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

+1
Предлагаю шестигранник сделать квадратным
можно и так, только уточнить, что касание углами плотное и воду не пропускает
...
Рейтинг: 0 / 0
Задачка про остров
    #39924732
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
можно и так, только уточнить, что касание углами плотное и воду не пропускает
Типа, в шестиграннике касание углов может быть и неплотным?
...
Рейтинг: 0 / 0
Задачка про остров
    #39924750
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Имя пользователя1
можно и так, только уточнить, что касание углами плотное и воду не пропускает
Типа, в шестиграннике касание углов может быть и неплотным?
в шестиугольнике касание сторонами, потому вопросов не возникает.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924755
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
в шестиугольнике касание сторонами
Внимательно посмотрите на собственную картинку.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
mayton
Просто прогаммировать структуры данных с графами - нудотство.

+1
Предлагаю шестигранник сделать квадратным

+1 В комьютерных играх типа Panzer General игровая поверхность так и задана. Более того
там хитрость есть как на квадрате больше ячеек впихнуть.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924774
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перебираем для каждого островка соседей. Если все 6 выше - тут лужа. Все. Всем спасибо все свободны.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924776
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя погорячился да.. Все не так..
...
Рейтинг: 0 / 0
Задачка про остров
    #39924783
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

касание любой пары шестиугольников никому не мешает.

а у квадратов, в реальном мире, не может так быть, чтобы А касался D, и в то же время B касался С (см. картинку). Потому отдельное пояснение про углы.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924785
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это копи-паста с одной из олимпиадных задач. Только там дождь капал на квадратные столбы и надо
было посчитать высоту луж после дождя. Границы столбов по краям уходили в минус бесконечность
тоесть по краям вода стекала вниз.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Хотя погорячился да.. Все не так..

Это в любом случае рекурсия. Изюминка будет в условии выхода.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924795
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется надо пытаться представить все с точки зрения воды - где она упрется не в море , стекая. А когда эти самые области уже конечное число - вот тут применять сравнение высот и прочее и прочее.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924801
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Крайние hexxagons которые упираются в море - надо приравнять к некому минимальному числу типа MIN_INTEGER.
2. Далее должен быть некий цикл по всем оставшимся hexxagons, где мы просто делаем min(x,y) по уровню
воды между всеми соседями.
3. Завершаем алгорим когда уровни воды перестали понижаться.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924843
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или я не понял, или 51325 лужу с двумя минимумами вы пропустите.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924844
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так же крайние клетки могут быть разной высоты. Не все так просто.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924849
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа по капле упало на каждый хекс. И множится она деревом на все клетки, которые ниже текущей. Уплыла в море - вычеркиваем, нет - ищем минимумы.
Нашли все минимумы.
В каждом минимуме - поднимаем уровень на один. - соответсвенно на все граничные хексы пуляем очередную каплю. И так далее и тому подобное.
Куча граничных условий, а если еще и на язык переклывать, не кислая такая программа выйдет.

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

Можно пойти от противного, закрашивая ячейки сливающиеся в океан цветом "Океан".
В лоб:
верхний ряд 1,4,3 - "Океан"
второй ряд 1, 5, , 5 - "Океан", 1 - нет выхода в океан "Лужа" (все окружающие выше или "Лужа")
третий ряд 2, 3, 6 - "Океан", 2 - нет выхода в океан "Лужа" (все окружающие выше или "Лужа"), 4 - неизвестно
четвертый ряд 2, 6, 2 - "Океан", 4 - неизвестно
пятый ряд 3, 1, 2 - "Океан"
обрабатываем оставшиеся, остались две 4-ки, обе получаются "Океан".

Можно идти по спирали сначала внутрь, потом наружу, по идее должны закрыть даже сложные случаи, но не уверен.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924859
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первым проходом красим все что смогли, дальше проходим по оставшимся начиная с низших номеров,
каждый проход уменьшая количество оставшихся до тех пор пока не останется ни одной ячейки не имеющей
статуса "Океан" или "Лужа".
...
Рейтинг: 0 / 0
Задачка про остров
    #39924862
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
второй ряд 1, 5, , 5 - "Океан", 1 - нет выхода в океан "Лужа" (все окружающие выше или "Лужа")
скорее, предполагаемая лужа.

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

Все площадки вокруг выше, это Лужа определяемая однозначно, также лужа определяется однозначно,
если все вокруг выше, либо уже определены однозначно как Лужа.

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

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

закрашенная клетка - это не океан, но и не лужа, это клетка, с которой вода утечет. Закрасили клетку, закрашиваем все соседние с ней, которые выше неё или равны ей (как в волновом алгоритме). Тогда всё незакрашенное будет лужами, но среди луж могут возвышаться островки, внутри которых снова могут быть лужи (но это уже другая история). Определим сначала лужи первого порядка, уровень воды в них, а далее доберемся до островов, и т.д.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924875
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в реализации это ни разу не просто.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924876
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
но в целом да, к волновому алгоритму (от краёв) дело идет, судя по всему.

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

эээ, проще некуда.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924880
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если это просто со всякими граничными условиями, то мой алгоритм наиболее оптимальный как мне кажется. Хотя посмотрел бы я на короткую реализацию этого действия.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924881
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или вы про свой вариант? Мой прочитайте, может понравится.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924882
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник,

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

постепенно срезать слои не получится.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924888
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Это копи-паста с одной из олимпиадных задач.
я видел тривиальный одномерный вариант, ну и подумал про плоскость. Выбрал шестиугольники только потому, что нет сомнительного касания углами.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924889
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Или вы про свой вариант? Мой прочитайте, может понравится.

На большом поле количество комбинаций кругов будет сравнимо с количеством отдельных площадок,
пройти по спирали с внешнего периметра к центру, а потом добивать оставшиеся неопределенные
на мой взгляд более оптимально, чем нарезать срезы с кучей кругов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924890
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не не.
Смотри - первый попавшийся не пустой овал - уже лужа. Просто по определению - внутри него есть клетки ниже и они никак не соединены с морем , потому как отсечены овалом.
Для наглядности - найдите здесь какой-то граничный случай (тут горы, а у вас будет наоборот - лужи)
http://www.vertikal-pechatniki.ru/bibl/images/clip_image004.jpg
Было у тебя поле из 100 хексов, не пустой овал отрезал 10 (его границы).
На следующем слое тебе уже придется анализировать 90 хексов. И так далее. Идем сверху а не снизу.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924891
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На картинке - первый замкнутый овал от края, который попадется - одна большая лужа.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924894
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если принять жирную черту (реку или что она там значит, за море) то на картинке всего 2 овала.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924896
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Не не.
Смотри - первый попавшийся не пустой овал - уже лужа. Просто по определению - внутри него есть клетки ниже и они никак не соединены с морем , потому как отсечены овалом.
Для наглядности - найдите здесь какой-то граничный случай (тут горы, а у вас будет наоборот - лужи)
http://www.vertikal-pechatniki.ru/bibl/images/clip_image004.jpg
Было у тебя поле из 100 хексов, не пустой овал отрезал 10 (его границы).
На следующем слое тебе уже придется анализировать 90 хексов. И так далее. Идем сверху а не снизу.
то есть копать изнутри и находить замкнутые контуры, внутри которых углубления? Но эти контуры нельзя выкидывать, они могут оказаться глубокими впадинами более обширной лужи.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924897
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложность алгоритма как раз распонать карту овалов, а нарезать - нет ничего проще.
Овал образовался, выкидываем все что внутри овала из следующей итерации, это уже лужа.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924899
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторто есть копать изнутри и находить замкнутые контуры, внутри которых углубления? Но эти контуры нельзя выкидывать, они могут оказаться глубокими впадинами более обширной лужи.
Этот контур лужа. Все в нем лужа. Есть конечно вариант что в данном овале 2 лужи. 5343437. Но это вычисляется уже когда объем лужи считать будешь.
Я почему ратую за этот алгоритм. Он более нагляден, а оценить предоженный ОраклДевом мысленно не так просто на наличие граничных условий.

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

Объем моря начальный V1.
Объем дождя V2.

В лужах осталось = Vморя результирующее - V1 - V2.

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

этапы:

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

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

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

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

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

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

Обход по какому правилу? По правилу поиска выхода из лабиринта?
обход, например, "поиском в ширину" - закрасили клетку, добавили в очередь тех соседей, которых тоже закрасим.
вот здесь примерно так по соседним клеткам идет закраска - https://ru.wikipedia.org/wiki/Алгоритм_Ли
...
Рейтинг: 0 / 0
Задачка про остров
    #39924921
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
На словах , на первый взгляд должно работать. А вот с реализацией мне кажется наплачетесь. Ветвистые деревья придется отрабатывать.
кто бы спорил)
всё время так - идея норм., в реализации костыли и подпорки
...
Рейтинг: 0 / 0
Задачка про остров
    #39924922
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому слезно прошу - посмотрите на мой вариант.
Алгоритм один послойный. Тупой как пробка. Самое сложное - найти таки эти окружности, что опять же решается в двумерном пространстве.
На каждую лужу - заряжаем опять ровно этот же алгоритм в рекурсии, пока не дойдем до вариант - что луж в остатке нет.

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

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

ну вот, например, кейс - где-то посреди острова несколько смежных ячеек 5, окруженных 6-ками и 7-ками. Нашли эту лужу, записали объем, залили цементом. Дальше снова ищем лужи?
...
Рейтинг: 0 / 0
Задачка про остров
    #39924927
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мой вариант, если выгорит, то тянет на O(N) по вспомогательной памяти - закраска, очередь для поиска и т.д., - и где-то O(5N) по времени - каждую клетку отрабатываем один раз, ничего не ищем.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924937
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору вот, например, кейс - где-то посреди острова несколько смежных ячеек 5, окруженных 6-ками и 7-ками. Нашли эту лужу, записали объем, залили цементом. Дальше снова ищем лужи?

Да не так же.

Вы прошли слоями сверху 1 раз. У вас после этого прохода остались скажем 10 луж.
Вам надо натравить данный алгоритм на каждую из луж, просто чтобы убедиться, что нет такого что лужа в луже. Пример лужи в луже с кольцевым островком:5393935. Для такого крайнего случая чуть усложнятся вычисления объема.

Ну как карты рисуют с высотами, умозрительно срезают слои и сразу видно - здесь пустота здесь земля.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924940
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Задачка про остров
    #39924944
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Вы прошли слоями сверху 1 раз.
вот это не совсем понял
...
Рейтинг: 0 / 0
Задачка про остров
    #39924949
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну сверху в низ вы идете.
Грубо у вас скажем набор высот хексов такой

5 7 8 9.

Тут получается что есть по уровням для нарезки 4 слоя + нуль (море).

На первом слое вы получите двухмерный срез (смотреть сверху на остров). Там будет только один хекс к пример (вершина).
Следующий слой - 8. Там уже будет другая картинка на срезе. И так далее.
Каждый срез надо посмотреть на наличие замкнутых фигур внутри среза (дырка в бублике или подобное). Дырка в бублике - лужа. Ее выкидываем из последующего расмсотрения (т.е. уменьшаем количество хексов для анализа).

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

Я уже не знаю как еще объяснить.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924951
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По этой картинке вы на третем шагу вычислите одну лужу (жерло вулкана). Если бы это был не замкнутый контур, то овала внутреннего не было бы. Был бы надгрызенный бублик (прогрызенный до дырки) Типа так
...
Рейтинг: 0 / 0
Задачка про остров
    #39924952
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде как исходные данные.

Код: sql
1.
2.
3.
4.
5.
    1 4 3
  1 5 1 5
2 3 2 4 6
2 6 4 2
3 1 2
...
Рейтинг: 0 / 0
Задачка про остров
    #39924953
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Грубо у вас скажем набор высот хексов такой

5 7 8 9.
если что, выбор высот может быть охренительный, сравнимый с количеством ячеек
...
Рейтинг: 0 / 0
Задачка про остров
    #39924955
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Вроде как исходные данные.

Код: sql
1.
2.
3.
4.
5.
    1 4 3
  1 5 1 5
2 3 2 4 6
2 6 4 2
3 1 2

да, как вариант. Слева сверху нулями забить, например

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

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

Код: c#
1.
2.
3.
4.
5.
    1 x x
  1 x 1 x
x x x x x
x x x x
x 1 x


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

Код: c#
1.
2.
3.
4.
5.
  1 x x
 1 x 1 x
x x x x x
 x x x x
  x 1 x



если я правильно понял, то эту дырку выявить на слое, высота которого равна 1, и он срезает всё, кроме 1.

но должен быть ещё предыдущий слой высотой 2, который выявит такое:
Код: c#
1.
2.
3.
4.
5.
  1 x x
 1 x 1 x
2 x 2 x x
 2 x x 2
  x 1 2


тут у нас бассейн площадью 2, объемом 2 ,

потому что до этого шел слой высотой 3, который сделал так
Код: c#
1.
2.
3.
4.
5.
  1 x 3
 1 x 1 x
2 3 2 x x
 2 x x 2
  3 1 2


но тут, и в слоях выше, замкнутых озер не было.

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

А чего на него смотреть? mayton кодить хочет постоянно, предложи ему реализовать все три алгоритма и сравнить))

Нет уж. Я не такой всеядный.

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

в общем, если при переходе к очередному слою быстро вычислять замкнутые контуры (их площади), то вполне жизненно. Пока не совсем понимаю, как это делать.

ну и предварительно надо обойти весь массив ячеек, для каждого слоя наколбасить коллекцию ячеек, которые будут закрашиваться.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924964
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно должен быть ещё предыдущий слой высотой 2, который выявит такое
Да все праваильно я упустил, что там тоже 2-ка окружена.
А так да - вы правильно ход моих мыслей поняли.
Выявится дыра окруженная x состоящая из двух клеток 1 и 2
Код: c#
1.
2.
3.
4.
5.
    1 4 3
  1 5 1 5
2 3 2 4 6
2 6 4 2
3 1 2


А на последующей итерации этот кусок уже вывалится из анализа, т.е. он не будет анализировать единичку во второй строке.
После прохождения по слоям у вас получится что есть одна лужа.
Как ее объем вычислить - разговор отдельный, но вы легко можете тупо почитать вес каждого хекса в данной луже.

Но предположим что что-то сложное в луже.

/\/\
/\/ \/\
/ \

Натравите алгоритм на сию лужу, представив что это такой остров в море (рекурсия). Алгоритм выделит опять лужу.
Т.е. в первом проходе выделится слой
/\* что между ними пока непонятно* /\
А после рекурсии на этом "новом острове"вы увидите
/\/\
...
Рейтинг: 0 / 0
Задачка про остров
    #39924966
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще имхо ваш пример как раз лучше решается вашим способом, но реализация не наглядна и не очевидна будет (куча массиов, подмассивов и так далее).
Но вот на больших площадях мой ИМХО нагляднее.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924968
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Но предположим что что-то сложное в луже.

Код: plaintext
1.
2.
3.
    /\/\
 /\/    \/\
/          \


тут самый верхний слой дает маленькую лужу, второй слой даёт большую лужу с островом (если это гора с симметрией вокруг центра).

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


ну а мой вариант закрасит внешнюю стену, потом большую лужу и с неё доберется до внутренней горы, которую тоже закрасит, и озеро вверху. Как раз та самая рекурсия.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924978
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы еще попробовал классифицировать острова по виду рельефа.
- шумящие (решаем только методом грубой силы)
- террасы (классифицируем близкие поверхности (плато)) и рассматриваем как 1 узел высоты вершины графа.
- лабиринты (где вода физическая может вытекать достаточно долго. Можно попробовать алгоритм "Волны").
...
Рейтинг: 0 / 0
Задачка про остров
    #39924979
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорян. Не смог приаттачить сразу под кат.
...
Рейтинг: 0 / 0
Задачка про остров
    #39924992
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто захочет поразвлекаться, исходные данные в массиве, списком и графом
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
public class Hexagon {

    public static final int NUMBER_OF_SIDES = 6;
    private int height;
    private String status;

    // индексы ребер
    //   1 /\ 2
    //  0 |  | 3
    //   5 \/ 4
    private Hexagon[] hexagonSides = new Hexagon[NUMBER_OF_SIDES];

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setHexagonSides(Hexagon[] hexagonSides) {
        this.hexagonSides = hexagonSides;
    }

    public Hexagon getHexagonSide(int side) {
        return hexagonSides[side];
    }

    public void setHexagonSide(int side, Hexagon hexagon) {
        this.hexagonSides[side] = hexagon;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Hexagon(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        //   1 /\ 2
        //  0 |  | 3
        //   5 \/ 4

        //         / \ / \ / \                    / \ / \ / \
        //        | 0 | 1 | 2 |                  | 1 | 4 | 3 |
        //       / \ / \ / \ / \                / \ / \ / \ / \
        //      | 3 | 4 | 5 | 6 |              | 1 | 5 | 1 | 5 |
        //     / \ / \ / \ / \ / \            / \ / \ / \ / \ / \
        //    | 7 | 8 | 9 | 10| 11|          | 2 | 3 | 2 | 4 | 6 |
        //     \ / \ / \ / \ / \ /            \ / \ / \ / \ / \ /
        //      | 12| 13| 14| 15|              | 2 | 6 | 4 | 2 |
        //       \ / \ / \ / \ /                \ / \ / \ / \ /
        //        | 16| 17| 18|                  | 3 | 1 | 2 |
        //         \ / \ / \ /                    \ / \ / \ /

        int[][] array = new int[][] {
                {0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 1, 4, 3, 0},
                {0, 0, 1, 5, 1, 5, 0},
                {0, 2, 3, 2, 4, 6, 0},
                {0, 2, 6, 4, 2, 0, 0},
                {0, 3, 1, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0}
        };

        // массив шестиугольников
        Hexagon[][] arrayHexagons = new Hexagon[array.length][array[0].length];
        // список шестиугольников
        ArrayList <Hexagon> listOfHexagons = new ArrayList<>(20);

        // заполняем массив и список, ссылки в массиве и списке на одни и те же шестиугольники
        for (int i = 0; i < array.length; i++ ) {
            for (int k = 0; k < array[i].length; k++) {
                if (array[i][k] > 0) {
                    arrayHexagons[i][k] = new Hexagon(array[i][k]);
                    listOfHexagons.add(arrayHexagons[i][k]);
                } else {
                    arrayHexagons[i][k] = null;
                }
            }
        }

        // записываем связи шестиугольников друг с другом
        for (int i = 1; i < array.length - 1; i++ ) {
            for (int k = 1; k < array[i].length - 1; k++) {
                if (array[i][k] > 0) {
                    arrayHexagons[i][k].setHexagonSides(new Hexagon[] {
                                    arrayHexagons[i][k-1], arrayHexagons[i-1][k], arrayHexagons[i-1][k+1],
                                    arrayHexagons[i][k+1], arrayHexagons[i+1][k], arrayHexagons[i+1][k-1] });
                }
            }
        }

        System.out.println(listOfHexagons);
        System.out.println("====================================");
        for (Hexagon[] h1: arrayHexagons) {
            for (Hexagon h2: h1) {
                if (h2 != null) {
                    System.out.print(h2 + " - ");
                    for (int i = 0; i < Hexagon.NUMBER_OF_SIDES; i++) {
                        System.out.print(h2.getHexagonSide(i) + ((i+1 < Hexagon.NUMBER_OF_SIDES) ? ", " : ""));
                    }
                    System.out.println();
                }
            }
        }
    }
}

...
Рейтинг: 0 / 0
Задачка про остров
    #39924994
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автори вот опять же, как быстро считать площади дырок на каждом срезе.
Когда у тебя есть массив луж, посчитать мне кажется сравнительно легко. Перебираешь высоты всех хексов, которые лужу окружают, берешь высоту самого маленького (Скажем X).
V воды в луже единичного хекса = (X-высота этого хекса)*1 //*1 потому как площадь хекса равна условной единице. Повторить для всех хексов которые в этой луже (т.е. исключить подсписок, который будет после рекурсии - т.е. исключить вложенную лужу, бортики этой лужи сами исключатся, потому что они выше X).
...
Рейтинг: 0 / 0
Задачка про остров
    #39925048
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачу можно решать по разному. Можно - как олимпиадную - такими деревянными матрциами и хардкодом топологии.

Давайте ее сведем хотя-бы к уровню постнаовки и решения на теории графов.

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

я их всего этого набора слов гед-то слышал только матрица и графы :) Разверни свой вариант.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окажи содействие. Преобразуй этот кусок шлака в графовое представление хотя-бы в формате GraphViz.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
        int[][] array = new int[][] {
                {0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 1, 4, 3, 0},
                {0, 0, 1, 5, 1, 5, 0},
                {0, 2, 3, 2, 4, 6, 0},
                {0, 2, 6, 4, 2, 0, 0},
                {0, 3, 1, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0}
        };



Я согласен помогать и задачки на графы - интересны но мне часто лень тратить своё время на пустяки.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925117
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже в сторонке постою, мне не то что лень, но с этими фокусами я мало знаком, а учить ради единоразового представления пятисотую по счету технологию, это только за деньги на работе.
Хотя что эт отакое посмотрю конечно, интересно же.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925123
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно. Я вообще хотел поднять отдельный топик. В продолжение моих Java Graph Libraries поисковых вопросов.
Primary Goal : на посмотреть параллельные алгоритмы на графах (к сожалению еще не выбрал какие).
Secondary Goal : java, atomic, locks, не-блокирующие коллекции и структуры данных.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925134
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Окажи содействие. Преобразуй этот кусок шлака в графовое представление хотя-бы в формате GraphViz

Объекты Hexagon - ноды графа, каждая нода связана с другими (грань связана с другой нодой или null), для реализации алгоритма на жаве самое то.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925137
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
mayton
Окажи содействие. Преобразуй этот кусок шлака в графовое представление хотя-бы в формате GraphViz

Объекты Hexagon - ноды графа, каждая нода связана с другими (грань связана с другой нодой или null), для реализации алгоритма на жаве самое то.

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

http://www.webgraphviz.com

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
"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"
"ec"->"de"
"de"->"ce"
"ca"->"da"
}

...
Рейтинг: 0 / 0
Задачка про остров
    #39925156
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подправил 41 и 42ую связи "de"->"ce"
"ca"->"da"
Блин вот красивая картинка.

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
Задачка про остров
    #39925157
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нули точно нужны? вся картинка слетит - будет почти от каждого узла в ноль стрелка
...
Рейтинг: 0 / 0
Задачка про остров
    #39925159
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник, я не вижу картинок с хостинга https://d.radikal.ru/

Пожалуйста перепость их куда-то в другое место.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925163
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сами напросились нуль добавлен.
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"
"aa"->"null"
"ab"->"null"
"ac"->"null"
"ba"->"null"
"bd"->"null"
"ca"->"null"
"ce"->"null"
"da"->"null"
"de"->"null"
"ea"->"null"
"eb"->"null"
"ec"->"null"
}

https://jpegshare.net/][img=https://jpegshare.net/images/86/d0/86d03158ddfb4e11defdb7c989bae08c.jpg[/img]
...
Рейтинг: 0 / 0
Задачка про остров
    #39925164
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot АСУ ТПшник#22077547]Сами напросились нуль добавлен.
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"
"aa"->"null"
"ab"->"null"
"ac"->"null"
"ba"->"null"
"bd"->"null"
"ca"->"null"
"ce"->"null"
"da"->"null"
"de"->"null"
"ea"->"null"
"eb"->"null"
"ec"->"null"
}

посоветуйте такой жу удобный как радикал картинкохранилище без регистраций и прочего...
https://jpegshare.net/86/d0/86d03158ddfb4e11defdb7c989bae08c.jpg.html
...
Рейтинг: 0 / 0
Задачка про остров
    #39925167
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы увы. Либо амазон либо гуглдрайв. Последник шарится через веб или нет я не помню.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925173
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я согласен но я говорю про обобщенные алгоритмы которые могут работать не для хексагонов а для плиток любой геометрии.

Не любые плитки могут сложиться также как шестигранники, да и проблем особых нет, я забил константой количество граней, но можно сделать инициализацию массива граней на требуемую размерность и работай себе с любым количеством граней. Другой вопрос в каком формате загонять тестовые данные, для простого примера с обычного плоского массива (который ты сам и предложил))) высот самый оптимальный вариант, сложный пример желательно в чем то рисовать, скидывать в файл и засасывать файл в свою структуру для обсчета. В рисовалках подобных вещей не силен, тем более в их сопряжении с жавой, вообще жавист у нас ты один))

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

Ориентация дуг графа у тебя неправильная, каждая дуга будет иметь направление от более высокой плитки к более низкой (путь по которому сливается вода с более высокой плитки), если смотреть со стороны нод то вес дуги для нод к примеру 3 и 9 будет для тройки 6 для девятки -6.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925182
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Поэтому слезно прошу - посмотрите на мой вариант.
Алгоритм один послойный. Тупой как пробка. Самое сложное - найти таки эти окружности, что опять же решается в двумерном пространстве.
На каждую лужу - заряжаем опять ровно этот же алгоритм в рекурсии, пока не дойдем до вариант - что луж в остатке нет.

Я же не просто так написал, закрашивание оно игтуитивно понятно было с самого начала.

Ты совершенно прав, идти нужно сверху, также как идет вода при отливе с каждой ступенькой оставляя либо залитые либо сухие плитки. Задача на самом деле несколько сложнее чем показалась сначала, для тестирования нужны случаи, когда есть как минимум три концентрические секции океан - стена - ров - стена - ров - ... - стена - центральное озеро и возможно сухой выступ в середине озера, ведь в каждой луже могут быть выступающие над уровнем незалитые водой плитки. Две концентрические системы должны быть связаны разными кольцами на разном уровне (сообщающиеся сосуды), чтобы вода перетекала из одной системы в другую и глубина заполнения одного из рвов определялась соседней системой, рвы могут быть незамкнутыми кольцами, третья концентрическая система должна быть независимой. В общем задача найти все сухие и все залитые плитки совсем не тривиальная.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925185
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТы совершенно прав, идти нужно сверху, также как идет вода при отливе с каждой ступенькой оставляя либо залитые либо сухие плитки. Задача на самом деле несколько сложнее чем показалась сначала, для тестирования нужны случаи, когда есть как минимум три концентрические секции океан - стена - ров - стена - ров - ... - стена - центральное озеро и возможно сухой выступ в середине озера, ведь в каждой луже могут быть выступающие над уровнем незалитые водой плитки. Две концентрические системы должны быть связаны разными кольцами на разном уровне (сообщающиеся сосуды), чтобы вода перетекала из одной системы в другую и глубина заполнения одного из рвов определялась соседней системой, рвы могут быть незамкнутыми кольцами, третья концентрическая система должна быть независимой. В общем задача найти все сухие и все залитые плитки совсем не тривиальная.
Да все это учтено в моем алгоритме. Посчитать количество воды в луже любой конфигурации не трудно, как только ты знаешь, что внутри лужи другой лужи нет - бублика.
Основная сложность найти главные лужи, вот это я и предложил за один проход высчитать.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925186
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОриентация дуг графа у тебя неправильная, каждая дуга будет иметь направление от более высокой плитки к более низкой
Это не ставилось целью мной какбы. Вот вам исходник, делайте что хотите.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925189
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Да все это учтено в моем алгоритме. Посчитать количество воды в луже любой конфигурации не трудно, как только ты знаешь, что внутри лужи другой лужи нет - бублика.
Основная сложность найти главные лужи, вот это я и предложил за один проход высчитать.

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

Исходник для расчета я сделал немного выше, шестисвязный список Hexagon, к нему можно итератор приделать, чтобы можно было переходить с ноды на ноду, посмотреть высоту ноды и высоты соседних уже можно сейчас, дело только за алгоритмом, которого пока нет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925195
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм... Еще раз подумайте над моим алгоритмом, все учтено. И сосуды и прочее. Режем по слоям - где нет замкнутой фигуры - вода польется куда то еще.
Ров уровня 0 - будет резать люой бублик и в него уходить будет вода. Кляксу в кляке нарисуйте, соедините их рвом, алгоритм все равно сжует это и не поперхнется - бублики будут рисоваться на срезе рва (т.е. самой низкой точки берега рва)). Если их нет замкнутых - ваша вода утекла в море.
Чего уже проще - если фигура замкнута, никуда ничего из нее не потечет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925196
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник,

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

Самое примитивное. Оператор тыкает - пустить закачку из Р1 в Р5.
Р1-Н2-Р5 (завдвижки я не рисовал) перекроет работу всего остального, а вот если пустить через насос Н1, то Н2 еще можно испльзовать для Р3 Н2 Р6.
Р1--|___Н1--|___Р4
Р2--|___Н2--|___Р5
Р3--| |___Р6

Это комплексаная проблема, которую долго можно жевать.
Пока никто даже системного подхода не описал народе:
1 Опишите в схеме потсоянные маршруты, котрые будут использоваться всегда.
2 Максимальную длину
и так далее и тому подобное.

Все сейчас сводится к проверке линий (аля не потекет ли бензин в ДТ, потому что задвижку забыли закрыть или не тот насос запустили).
...
Рейтинг: 0 / 0
Задачка про остров
    #39925404
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тему графов. Предложу 2 инварианта.

Для данной сущности.

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

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

}



1) Каков-бы не был уровень воды - уровень земли меньше либо равен уровню воды в этой ячейке.

Код: sql
1.
height <= waterLine



2) Все соседние ячейки с одинаковым уровнем земли (и соседние по отношению к соседним)
всегда имеют одинаковый уровень воды.

(он может быть неодинаковым в вашем алгоритме на какой-то итерации. Но после
достижения стационарного состояния алгоритма в целом - это будет так)


Отсюда вытекает интересное преобразование.

Группу связных вершин графа имеющих одинаковый параметр height мы можем заменить на 1 единственную
вершину топологически связную с соседями данной группы.

С точки зрения картинки - не меняется ничего. Но алгоритм упрощается. Мы выбрасываем целое "плато"
столбиков с одинаковой высотой и заменяем его на 1 виртуальный столбик который имеет neightbours()
существенно больше чем 4 или 6. Но для нас это неважно.

Тоесть для ландшафтов с большим количеством плато объем вычислений прилиовов и отливов может быть
существенно сокращен за счет такого топологического преобразования.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925421
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько моих способностей хватило изобразил пример для тестирования
...
Рейтинг: 0 / 0
Задачка про остров
    #39925425
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Четырехсвязный узел для графа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public class Node {

    public final int NUMBER_OF_NEIGHBOURS;
    private int height;
    private String status;

    private Node[] neighbours;

    public Node(int height) {
        this(height, 4);
    }

    public Node(int height, int NUMBER_OF_NEIGHBOURS) {
        this.NUMBER_OF_NEIGHBOURS = NUMBER_OF_NEIGHBOURS;
        this.height = height;
        this.neighbours = new Node[this.NUMBER_OF_NEIGHBOURS];
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setNeighbours(Node[] neighbours) {
        this.neighbours = neighbours;
    }

    public Node getNeighbour(int neighbour) {
        return neighbours[neighbour];
    }

    public void setNeighbour(int neighbour, Node node) {
        this.neighbours[neighbour] = node;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}

...
Рейтинг: 0 / 0
Задачка про остров
    #39925443
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
...
Р1--|___Н1--|___Р4
Р2--|___Н2--|___Р5
Р3--| |___Р6
Это комплексаная проблема, которую долго можно жевать.
...
Что мешает свести к (например)выпуклой задаче минимизации с выпуклыми же ограничениями?.. Вообще, расписаны уже все ограничения или как всегда разбросаны в головах? Какие показатели и как оптимизировать?..
Что в задаче навроде переменных (флажки ...), а что навроде относительно статических "справочников" (содержимое Р(i) )?..............
...
Рейтинг: 0 / 0
Задачка про остров
    #39925444
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
АСУ ТПшник
...
Р1--|___Н1--|___Р4
Р2--|___Н2--|___Р5
Р3--| |___Р6
Это комплексаная проблема, которую долго можно жевать.
...
Что мешает свести к (например)выпуклой задаче минимизации с выпуклыми же ограничениями?.. Вообще, расписаны уже все ограничения или как всегда разбросаны в головах? Какие показатели и как оптимизировать?..
Что в задаче навроде переменных (флажки ...), а что навроде относительно статических "справочников" (содержимое Р(i) )?..............

Что-то вроде Форда Фалкерсона по расчету потока. Если вентили - неуправляемые.
Если управляемые - то неясна цель управления? Максимальная загрузка?
Загрузка чего? Насосов? Или всей сети?

Тут нельзя так вот небрежно бросаться заданиями. Это-ж неуважение к читающему.
Тут люди рады решать головоломки но зачем-же их заставлять додумывать ?
...
Рейтинг: 0 / 0
Задачка про остров
    #39925583
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачи в головах.
Забейте. Не тратьте время.
Было бы все прописано , я бы уже озолотился.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925585
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно. Ты если захочешь ее поставить - лучше отдельным топиком.
...
Рейтинг: 0 / 0
Задачка про остров
    #39925850
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Четырехсвязный узел для графа
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public class Node {

    public final int NUMBER_OF_NEIGHBOURS;
    private int height;
    private String status;

    private Node[] neighbours;

    public Node(int height) {
        this(height, 4);
    }

    public Node(int height, int NUMBER_OF_NEIGHBOURS) {
        this.NUMBER_OF_NEIGHBOURS = NUMBER_OF_NEIGHBOURS;
        this.height = height;
        this.neighbours = new Node[this.NUMBER_OF_NEIGHBOURS];
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setNeighbours(Node[] neighbours) {
        this.neighbours = neighbours;
    }

    public Node getNeighbour(int neighbour) {
        return neighbours[neighbour];
    }

    public void setNeighbour(int neighbour, Node node) {
        this.neighbours[neighbour] = node;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}


Тут лучше всё таки не класс а интерфейс. Чтобы иметь разные реализации.
Ябы предложил так.

Код: java
1.
2.
3.
INode
 +- BitmapImageNode
 +- HexagonTextFileNode



Что это дает.

Это даёт обобщенный алгоритм. И возможность оптимизаций по памяти. +Шаблон Flyweight.
Как оптимизация системы хранения. Нам не обязательно хранить Node для каждого пиксела
картинки. Достаточно к картинке предоставлять INode интерфейс.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926010
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задаем V = 0;
1) строим ориентированный граф у которого вершины - шестиугольники, а каждое ребро ведет от одной вершины к другой если соответствующие шестиугольники примыкают и высота первого больше чем высота второго.
2) ищем любую вершину которая не примыкает к морю и имеет только входящие ребра, причем хотя бы одно
3) если на 2 вершина не найдена, то результат в V
4) к найденной вершине добавляем к высоте 1 и увеличиваем V на 1
5) повторяем все начиная с шага 1

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


Да, точно, не учел. Ну что же буду думать дальше. :)
...
Рейтинг: 0 / 0
Задачка про остров
    #39926201
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
задаем V = 0;
1) строим ориентированный граф у которого вершины - шестиугольники, а каждое ребро ведет от одной вершины к другой если соответствующие шестиугольники примыкают и высота первого больше чем высота второго.

Орграф нас ограничивает IMHO.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926207
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat

Можно, конечно, еще оптимизировать, если вместе с найденной вершиной захватывать все которые достижимы из неё (не по нашему графу, а просто по граням шестиугольников) и у которых текущая высота такая же как у найденной и увеличивать не на 1, а на большее значение анализируя прилегающие к ним.

Смотрите. По поводу любых идей оптимизирующих или трансформирующих сам граф.

Вы должны доказать что ваше преобразование по complexity будет дешевле чем "лобовое" решение задачи сходу.
Сюда-же до кучи моё предложение по свёртке одинаковых высот в кучу.

Тоесть 2 варианта.
1) Решение задачи 1 раз в лоб любым алгоритмом.
2) Оптимизация ландшафта до некого упрощенного графа. И многокраное решение задачи прилива-отлива.
Только я не уверен что автор топика такое многократное решение прилива заказывал.

Понимаете да? Это как построение индекса по таблице в БД. Одноразово - неэффективно. А эффективно при
периодических использованиях.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926241
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, еще один вариант решения.

1) Находим максимальную высоту шестиугольников
2) Каждому шестиугольнику присваиваем число (назовем его "теущей высотой", в отличии от просто "высоты" заданной в условиях задачи) равное максимальной высоте из п.1
3) Начало цикла
4) Ищем любой шестиугольник который имеет "текущую высоту" больше своей "высоты" и либо:
а) Граничит с морем
б) Имеет хоть один соседний шестиугольник с меньшей "текущей высотой"
5) Если на п.4. мы такого шестиугольник не нашли, то выходим из цикла
6) Иначе, Если на п.4. найден шестиугольник который граничит с морем, то устанавливаем его "текущую высотуо" равную его "высоте"
7) Иначе устанавливаем значение его "текущей высоты" в значение максимальное из его "высоты" и минимальной "текущей высоты" всех его соседей.
8) Возвращаемся в начало цикла
9) Здесь мы вышли из цикла
10) Суммируем по всем шестиугольникам разницы между их "текущей высотой" и "высотой" - это и будет результат (объем луж).
...
Рейтинг: 0 / 0
Задачка про остров
    #39926275
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде верно.
Кстати, на определенных этапах корректировка "текущей высоты" будет распространяться от краёв, как тут 22077648
...
Рейтинг: 0 / 0
Задачка про остров
    #39926333
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже на вариант с "текущей высотой" - сортируем ячейки по высоте, затем последовательно наполняем каждую дельту высот:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
type
  TCell= record
    cx, cy, cz: integer;
    next: integer;
    end;

var
  c: array of TCell;
  ndx: array of array of integer;
  h: array[0..4, 0..4] of integer= (
    (0,1,4,3,0),
     (1,5,1,5,0),
    (2,3,2,4,6),
     (2,6,4,2,0),
    (0,3,1,2,0));

procedure SortCells;
var
  i, j, k: integer;
  t: TCell;
begin;
  k:=Length(c)-1;
  if k<=0 then exit;
  j:=k; i:=j;
  repeat;
    dec(i);
    if c[i].cz>c[j].cz then j:=i;
    until i<=0;
  if j<>k then begin;
    t:=c[j]; c[j]:=c[k]; c[k]:=t;
    end;

  i:=k-1;
  while i>0 do begin;
    j:=i; dec(i);
    if c[i].cz>c[j].cz then begin;
      repeat;
        inc(j);
        until not (c[i].cz>c[j].cz);
      dec(j);
      t:=c[i];
      for k:=i to j-1 do c[k]:=c[k+1];
      c[j]:=t;
      end;
    end;
  end;

procedure ReadCells;
var
  x, y, xcount, ycount, i: integer;
begin;
  ycount:=Length(h);
  xcount:=Length(h[0]);
  SetLength(c, ycount*xcount);
  for y:=0 to ycount-1 do for x:=0 to xcount-1 do with c[y*xcount + x] do begin;
    cx:=x; cy:=y; cz:=h[y,x];
    end;
  SortCells;
  SetLength(ndx, ycount, xcount);
  for i:=0 to Length(c)-1 do ndx[c[i].cy, c[i].cx]:=i;
  end;

function Neighbour(i, j: integer): integer;
var
  x, y, d: integer;
begin;
  Result:=-1;
  x:=c[i].cx;
  y:=c[i].cy;
  d:=0; if y and 1=0 then d:=-1;
  case j of
    0: begin; x:=x+d; y:=y-1; end;
    1: begin; x:=x+d+1; y:=y-1; end;
    2: x:=x-1;
    3: x:=x+1;
    4: begin; x:=x+d; y:=y+1; end;
    5: begin; x:=x+d+1; y:=y+1; end;
    else begin; x:=-1; y:=-1; end;
    end;
  if (y>=0) and (y<Length(ndx)) and (x>=0) and (x<Length(ndx[0])) then Result:=ndx[y,x];
  end;

function CountCells(last: integer): integer;
var
  i, j, n, k, sum: integer;
begin;
  Result:=0;
  for i:=0 to last do begin;
    c[i].next:=i;
    for j:=0 to 5 do begin;
      n:=Neighbour(i,j);
      if n<0 then c[i].next:=-1
      else if n<i then begin;
        repeat;
          k:=n; n:=c[n].next;
          until (k=n) or (n<0);
        if n<0 then c[i].next:=-1 else c[n].next:=i;
        end;
      end;
    end;
  for i:=0 to last do begin;
    sum:=0; n:=i;
    repeat;
      inc(sum);
      k:=n; n:=c[n].next;
      if k>=0 then c[k].next:=-1;
      until (k=n) or (n<0);
    if n>=0 then
    Result:=Result+sum;
    end;
  end;

function FillCells: integer;
var
  i, dz: integer;
begin;
  Result:=0;
  ReadCells;
  for i:=0 to Length(c)-2 do begin;
    dz:=c[i+1].cz - c[i].cz;
    if dz>0 then
    Result:=Result + dz * CountCells(i);
    end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin;
  Memo1.Lines.Add(IntToStr(FillCells));
  end;

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

Есть идея - а можно ли перепрыгнуть с точек и их уровней, на наклоны соединений между клетками? Ну т.е. простейший случай - 8657. Два выхода к морю в двухмерном пространстве. 8->6 наклон отрицательный. 6->5 отрицательный.7->5 отрицательный. Наклон может быть суммирующимся.

Подозреваю что можно , через суммирование весов каждого наклона типа 8 против 5 - вода не вытечет, но не уверен в целессобразности.

Т.е. идея какая - кратчайший путь от центра к низинам или от моря к самой высокой точке по А алгоритму с правилом каким-то, а потом веса наклонов считать.

Был пьян, вспылил :D
...
Рейтинг: 0 / 0
Задачка про остров
    #39926402
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для всех ячеек и их ближних соседей.

Инвариант - вода течет вниз. Ивариант вода не ниже чем дно. Инвариант. Любая вода - не ниже чем океан.

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

Разовью мысль.
"Практическое" решение уже нашлось.
В области теории всего обо всем,42, оно как бы отсекает абсолютно нейтральный подход - мы не знаем чего будем анализировать. Т.е. получается уже искусственные ограничения для искусственной же задачи. Зачем? Очень уверен, что лужа глубже уровня моря может быть без значительного усложнения.

Задача так-то вырождается вообще в простой вопрос.

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


Извини, не смог уложиться в 5 строк.

Суть, как сказано в преамбуле перед портянкой, в том,
что мы будем вместо одной сложной задачи
последовательно решать более простые задачи,
по одной для каждого изменения высоты ячейки.

АСУ ТПшник
Есть идея - а можно ли перепрыгнуть с точек и их уровней, на наклоны соединений между клетками? Ну т.е. простейший случай - 8657. Два выхода к морю в двухмерном пространстве. 8->6 наклон отрицательный. 6->5 отрицательный.7->5 отрицательный. Наклон может быть суммирующимся.

Подозреваю что можно , через суммирование весов каждого наклона типа 8 против 5 - вода не вытечет, но не уверен в целессобразности.

Т.е. идея какая - кратчайший путь от центра к низинам или от моря к самой высокой точке по А алгоритму с правилом каким-то, а потом веса наклонов считать.

Был пьян, вспылил :D


С нетерпением жду реализации в 5 строк этой замечательной идеи.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926414
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторС нетерпением жду реализации в 5 строк этой замечательной идеи.
Вода должна оставаться в луже :D
А серьезно - куча реализаций может быть. Но суть в том, что ваш код даже без комментариев. Чего он там и зачем делает, концептуально непонятно, реверс инжиниринг - ну извините, лень. Тут как-то на интуитивно понятном языке обходились пока не влез ОраклДевелопер, который приделал к переменным геттеры и сеттеры
...
Рейтинг: 0 / 0
Задачка про остров
    #39926416
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто мы будем вместо одной сложной задачи
последовательно решать более простые задачи,
Не уследил за изложением в сообщениях. По утру попробую.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926425
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
авторС нетерпением жду реализации в 5 строк этой замечательной идеи.

Вода должна оставаться в луже :D
А серьезно - куча реализаций может быть. Но суть в том, что ваш код даже без комментариев. Чего он там и зачем делает, концептуально непонятно, реверс инжиниринг - ну извините, лень...

Их есть у меня:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
type
  TCell= record                                 //типа ячейка, а то еще подумаете че-нить другое
    cx, cy, cz: integer;                       //координаты в нашем трехмерном мире, а вы че думали?
    next: integer;                              //ячейка, куда повелеваю течь воде, (если -1, то вытекает нафиг)
    end;

var
  c: array of TCell;                            //отсортированные по высоте ячейки, тип как бы намекает
  ndx: array of array of integer;         //индекс для быстрого поиска ячейки по паре координат (x,y), имя как бы ниочем
  h: array[0..4, 0..4] of integer= (     //что это, я вообще не знаю
    (0,1,4,3,0),
     (1,5,1,5,0),
    (2,3,2,4,6),
     (2,6,4,2,0),
    (0,3,1,2,0));

procedure SortCells;                         //заполняет массив c на основе карты высот, реализация любая

procedure ReadCells;                        //читает карту высот, вызывает SortCells, формирует ndx

function Neighbour(i, j: integer): integer;  //для i-той ячейки возвращает номер j-того соседа, или -1, но это нифига не очевидно 

function CountCells(last: integer): integer;  //считает ячейки в интервале [0..last] из которых не течет до высоты ячейки с[last+1]

function FillCells: integer;                 //считает общий объем воды, как сумму объемов в каждом срезе 
                                                      //на что намекает оператор в теле: Result:=Result + dz * CountCells(i);
...
Рейтинг: 0 / 0
Задачка про остров
    #39926489
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня где-то была своя имплементация алгоритма diamong-square на С++.
Потерял код к сожалению. Но она не для решения этой задачи а просто
для генерации реалистичных карт островов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926686
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Портянка немного увеличилась, сделаны 2 изменения:

1) Теперь правильно вычисляется объем среза, когда он содержит сливающиеся ручейки.
Чтобы при этом не пострадала скорость, пришлось расширить структуру ячейки.

2) Изменены параметры функции CountCells, чтобы не повторять в ней ранее сделанные вычисления

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
//Остров разбит на правильные шестиугольные ячейки площади 1 различной высоты над уровнем моря.
//Найти максимальный объем воды, которая не стечет в море после долгих проливных дождей.

type
  TCell= record                        //ячейка
    cx, cy, cz: integer;               //cx, cy - координаты, cz - высота ячейки
    next: integer;                     //следующая ячейка, куда течет вода, (если -1, то вытекает наружу)
    head: integer;                     //голова ручья (если -1, то это голова ручья, вытекающего наружу)
    end;

var
  c: array of TCell;                   //отсортированные по высоте ячейки
  ndx: array of array of integer;      //индекс для быстрого поиска ячейки в массиве c по паре координат (x,y)
  h: array[0..4, 0..4] of integer= (   //карта высот ячеек
    (0,1,5,5,0),
     (3,5,1,5,0),
    (6,1,2,4,6),
     (6,6,1,4,0),
    (0,3,4,4,0));

//сортирует массив c
procedure SortCells;
var
  i, j, k: integer;
  t: TCell;
begin;
  k:=Length(c)-1;
  if k<=0 then exit;
  j:=k; i:=j;
  repeat;
    dec(i);
    if c[i].cz>c[j].cz then j:=i;
    until i<=0;
  if j<>k then begin;
    t:=c[j]; c[j]:=c[k]; c[k]:=t;
    end;

  i:=k-1;
  while i>0 do begin;
    j:=i; dec(i);
    if c[i].cz>c[j].cz then begin;
      repeat;
        inc(j);
        until not (c[i].cz>c[j].cz);
      dec(j);
      t:=c[i];
      for k:=i to j-1 do c[k]:=c[k+1];
      c[j]:=t;
      end;
    end;
  end;

//читает карту высот, вызывает SortCells, формирует ndx
procedure ReadCells;
var
  x, y, xcount, ycount, i: integer;
begin;
  ycount:=Length(h);
  xcount:=Length(h[0]);
  SetLength(c, ycount*xcount);
  for y:=0 to ycount-1 do for x:=0 to xcount-1 do with c[y*xcount + x] do begin;
    cx:=x; cy:=y; cz:=h[y,x];
    end;
  SortCells;
  SetLength(ndx, ycount, xcount);
  for i:=0 to Length(c)-1 do ndx[c[i].cy, c[i].cx]:=i;
  end;

//для i-той ячейки возвращает позицию в массиве c ее j-того соседа, или -1
function Neighbour(i, j: integer): integer;
var
  x, y, d: integer;
begin;
  Result:=-1;
  x:=c[i].cx;
  y:=c[i].cy;
  d:=0; if y and 1=0 then d:=-1;
  case j of
    0: begin; x:=x+d; y:=y-1; end;
    1: begin; x:=x+d+1; y:=y-1; end;
    2: x:=x-1;
    3: x:=x+1;
    4: begin; x:=x+d; y:=y+1; end;
    5: begin; x:=x+d+1; y:=y+1; end;
    else begin; x:=-1; y:=-1; end;
    end;
  if (y>=0) and (y<Length(ndx)) and (x>=0) and (x<Length(ndx[0])) then Result:=ndx[y,x];
  end;

//считает ячейки в интервале [0..last] из которых не течет до высоты ячейки с[last+1]
function CountCells(first, last: integer): integer;
var
  i, j, n, k, sum: integer;
begin;
  Result:=0;
  //вычисляем значения next для ячеек c[first..last]
  for i:=first to last do begin;
    c[i].next:=i;
    for j:=0 to 5 do begin;
      n:=Neighbour(i,j);
      if n<0 then c[i].next:=-1
      else if n<i then begin;
        repeat;
          k:=n; n:=c[n].next;
          until (k=n) or (n<0);
        if n<0 then c[i].next:=-1 else c[n].next:=i;
        end;
      end;
    end;
  //инициализация перед подсчетом - каждый сам себе голова
  for i:=0 to last do c[i].head:=i;
  //считаем количество ячеек в каждом ручье, с учетом того, что они могут сливаться
  for i:=0 to last do begin;
    sum:=0; n:=i;
    repeat;
      k:=c[n].head;
      if k<>n then begin; //если у очередной ячейки определена голова, то это слияние ручьев
        if c[k].head<0 then n:=-1; //если из головы течет наружу, то и это ручей течет туда же
        break;
        end;
      c[n].head:=i; inc(sum); //запомнили голову ручья и ячейка пошла на ум
      k:=n; n:=c[n].next;
      until (k=n) or (n<0);
    if n<0 then c[i].head:=-1 else Result:=Result+sum; //если не вытекло, то прибавим, что в уме
    end;
  end;

//считает общий объем воды, как сумму объемов в каждом срезе
function FillCells: integer;
var
  i, j, dz: integer;
begin;
  Result:=0;
  ReadCells;
  j:=0;
  for i:=0 to Length(c)-2 do begin;
    dz:=c[i+1].cz - c[i].cz; //высота очередного среза
    if dz>0 then begin;
      Result:=Result + dz * CountCells(j,i); //добавили объем среза [j..i]
      j:=i+1;
      end;
    end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin;
  Memo1.Lines.Add(IntToStr(FillCells));
  end;

...
Рейтинг: 0 / 0
Задачка про остров
    #39926715
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
закодю свой вариант, как время будет)
...
Рейтинг: 0 / 0
Задачка про остров
    #39926807
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой ой ой.
ТЗ со входными и выходными данными отсутствует. Предлагаю взять картинку Мэйтона и как-то визуализировать результаты. А то получается как всегда. Классы и мы, тупые АСУТПшники с геттерами сеттреами можем.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926827
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсивный вариант получился немного короче.
Здесь процедуры ReadCells и Neighbour те же, что и в нерекурсивном варианте 22079993 .

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
procedure SetLevel(i, level: integer);
var
  j, n: integer;
begin;
  for j:=0 to 5 do begin;
    n:=Neighbour(i,j);
    if (n<0) or (c[n].head<=level) then continue;
    if c[n].cz>level then c[n].next:=n
    else begin;
      c[n].head:=level;
      SetLevel(n, level);
      end;
    end;
  end;

function FillCells2: integer;
var
  i, x, y, z: integer;
begin;
  Result:=0;
  ReadCells;
  x:=Length(h[0])-1;
  y:=Length(h)-1;
  z:=c[Length(c)-1].cz;
  for i:=0 to Length(c)-1 do begin;
    c[i].next:=-1;
    c[i].head:=z;
    end;
  for i:=0 to Length(c)-1 do with c[i] do
    if (cx=0) or (cx=x) or (cy=0) or (cy=y) or (next=i) then SetLevel(i, c[i].cz);
  for i:=0 to Length(c)-1 do with c[i] do
    if head>cx then Result:=Result + (head-cx);
  end;

procedure TForm1.Button2Click(Sender: TObject);
begin;
  Memo1.Lines.Add(IntToStr(FillCells));
  end;

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

Предлагаю закрасить синим цветом где океан.
Ну и картинку - побольше. На весь экран.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926835
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Предлагаю закрасить синим цветом где океан.
Ну и картинку - побольше. На весь экран.


Океан - ненужная деталь в этой задаче.
Есть квадратный остров, за его пределами - минус бесконечность.
Результат будет тем же.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926836
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно взять и нарисовать картинку такого плана 22077903
как и предлагал mayton пиксели-квадраты с четырьмя сторонами, 256 градаций серого,
0-океан, 1-255 разные высоты чем темнее тем выше, хотя можно и инвертировать, кому как нравится,
перегнать ее в массив и обработать алгоритмом закрасив в 0 плитки оставшиеся под водой,
потом обратно в картинку и сравнивать что получилось.
...
Рейтинг: 0 / 0
Задачка про остров
    #39926843
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если лень формировать графику - воспользуйтесь псевдо-текстовым форматом (PPM) графики.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927062
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимо проходил, вопрос возник.
Соседство такое:
- 4 5 это типа м-ца для сотовых ячеек?
2 (ху) 3
- 0 1
Никто не пробовал в полярных координатах мыслить? мне показалось соседство натуральнее будет, а то в матрице вроде прыгает туда-сюда, хотя бы уж по кругу пустили как в полярных.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927063
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Мимо проходил, вопрос возник.
Соседство такое:
- 4 5 это типа м-ца для сотовых ячеек?
2 (ху) 3
- 0 1
Никто не пробовал в полярных координатах мыслить? мне показалось соседство натуральнее будет, а то в матрице вроде прыгает туда-сюда, хотя бы уж по кругу пустили как в полярных.

Я иногда. Рассеяно разглядывая глобус думаю что полярная сетка координат - хреновая идея.
Вот если взять икосаэдр. И натянуть его на глобус. А потом образующие его треугольники разбить
еще на 4 треугольника. И т.д рекурсивно. То мы получаем вполне себе красивую систему координат
икосаэдральной системы. Где нет дефекта искажения координат как на полюсах. Равномерно
по всей поверхности треугольнички будут примерно равны. Хотя где-то в узловых точках искосаэдра
где сходятся в 1 точке 5 треугольников они будут не совсем равносторонние. Но это пустяк ИМХО.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927066
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В задаче как раз "нет дефекта искажения координат", всё на плоскости. Соседи только по окружности ( а это номер угла) и по радиусу (это вообще +-1). Ещё по прямым (квазикасательные к окружностям == секущие их в 2-х точках). Вот и все 6 направлений. Всё очень естественно. Лежит в той же м-це только по кругу, но я не навязываю. Может автор матрицы так и мыслил, из матрице только не скажешь.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927083
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остров мог быть не шестиугольный. Могла быть система островов с изломанной береговой линией.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927091
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Рекурсивный вариант получился немного короче.
Здесь процедуры ReadCells и Neighbour те же, что и в нерекурсивном варианте 22079993 .

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
procedure SetLevel(i, level: integer);
var
  j, n: integer;
begin;
  for j:=0 to 5 do begin;
    n:=Neighbour(i,j);
    if (n<0) or (c[n].head<=level) then continue;
    if c[n].cz>level then c[n].next:=n
    else begin;
      c[n].head:=level;
      SetLevel(n, level);
      end;
    end;
  end;

function FillCells2: integer;
var
  i, x, y, z: integer;
begin;
  Result:=0;
  ReadCells;
  x:=Length(h[0])-1;
  y:=Length(h)-1;
  z:=c[Length(c)-1].cz;
  for i:=0 to Length(c)-1 do begin;
    c[i].next:=-1;
    c[i].head:=z;
    end;
  for i:=0 to Length(c)-1 do with c[i] do
    if (cx=0) or (cx=x) or (cy=0) or (cy=y) or (next=i) then SetLevel(i, c[i].cz);
  for i:=0 to Length(c)-1 do with c[i] do
    if head>cx then Result:=Result + (head-cx);
  end;

procedure TForm1.Button2Click(Sender: TObject);
begin;
  Memo1.Lines.Add(IntToStr(FillCells));
  end;



Давайте поставим более широко задачу. Допустим наш остров имеет очень мелкую и точную детализацию высот.
Даже не 1000х1000 пикселов а давайте зададим в 1млн на 1 млн.

Вобщем давайте подумаем о параллелизме основного алгоритма.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927094
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсть квадратный остров, за его пределами - минус бесконечность.
Как бы абсолютно согласен, но есть просьба, без кода на словах. Потому как концептуально обсуждаем все же. Никаких утилитарных применений не предвидится.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927096
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте поставим более широко задачу. Допустим наш остров имеет очень мелкую и точную детализацию высот.
Даже не 1000х1000 пикселов а давайте зададим в 1млн на 1 млн.

Вобщем давайте подумаем о параллелизме основного алгоритма.


Зачем? Теоретически высота одного угла может влиять на решение в другом.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927120
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параллелизм на графовых задачах - это сложная тема. Это - челендж.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927134
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник, если на пальцах, то:

Рекурсивный алгоритм 22080232 работает со "срезающими" ячейками.
Так мы назовем те ячейки, которые срезают уровень воды в соседних ячейках
до своей высоты или своего уровня воды (до того, что выше).
После всех возможный срезаний сложим объем воды в каждой ячейке и получим ответ.

Чтобы уменьшить объем вычислений и обезопаситься от зацикливания,
мы предварительно отсортируем ячейки по высоте.
Сначала объявим срезающими все граничные ячейки и ячейку максимальной высоты.
Множество срезающих ячеек может пополняться в ходе вычислений.

Основной цикл перебирает ячейки в отсортированном массиве
и для каждой срезающей ячейки вызывает процедуру среза,
которая, перебирая ее соседей, делает следующее:
1) если уровень воды в соседе ниже или равен срезу, то пропускаем соседа,
2) если высота соседа выше среза, то объявляем соседа срезающей ячейкой,
3) иначе срезаем уровень воды в соседе и для него вызываем процедуру среза.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927176
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Соседних? Замкнутые контуры он как отработает?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927179
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки самый правильный вариант идти сверху срезая по слоям, и разделяя ячейки на сухие и затопленные,
начинаем с максимальной высоты острова (если начинать не с максимальной, то замкнутые контуры на первом шаге
будут сухими), ВСЕ площадки не имеющие статуса и равные текущему срезу объявляются сухими сразу,
далее мы должны найти все замкнутые контуры на срезе равные по высоте срезу, ячейки внутри контуров,
которым не присвоен статус сухие, получают статус затопленные. Опускаемся на уровень ниже и
проделываем ту же процедуру, ячейки со статусом затопленные в рассмотрение не принимаются,
ячейки со статусом сухие могут образовывать контур, статусы установленные на предыдущих уровнях
изменению не подлежат, они окончательные. Вопрос только в том как искать замкнутые контуры на
уровнях, т.е. контуры у которых высота равна высоте среза или они уже имеют статус сухие.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927182
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проходим по текущему срезу по периметру и ставим временный статус под водой на данном этапе отлива,
всем ячейкам до которых сможем добраться проходя от периметра вглубь, ячейки с высотой равной срезу
не переходим, таким образом у нас будут три градации на уровне, ячейки у которых ранее поставлен статус
сухие и ячейки равные по высоте срезу - сухие окончательно и бесповоротно, ячейки до которых смогли
добраться от периметра на данном срезе - временный статус под водой на данном этапе, на следующих
шагах этот статус не учитывается, все оставшиеся без статуса ячейки это ячейки внутри контуров и ниже
высоты среза, присваиваем им окончательный статус - под водой.

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

Оба алгоритма выдают одинаковый результат на больших массивах случайных данных,
что, по-видимому, означает, что в них одинаковое количество одинаковых ошибок )

Для больших массивов имеет смысл переписать процедуру SortCells,
заменив сортировку вставками на быструю сортировку.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
procedure SetLevel(i, level: integer);
var
  j, n: integer;
begin;
  for j:=0 to 5 do begin;
    n:=Neighbour(i,j);
    if n>=0 then with c[n] do if head>=level then begin;
      if cz>level then begin;
        head:=cz;
        next:=n;
        end
      else if head>level then begin;
        head:=level;
        SetLevel(n, level);
        end;
      end;
    end;
  end;

function FillCells2: integer;
var
  i, x, y, z: integer;
begin;
  Result:=0;
  ReadCells;
  x:=Length(h[0])-1;
  y:=Length(h)-1;
  z:=c[Length(c)-1].cz;
  for i:=0 to Length(c)-1 do with c[i] do begin;
    if (cx=0) or (cx=x) or (cy=0) or (cy=y) then begin;
      next:=i;
      head:=cz;
      end
    else begin;
      next:=-1;
      head:=z;
      end;
    end;
  for i:=0 to Length(c)-1 do with c[i] do if next=i then SetLevel(i, c[i].cz);
  for i:=0 to Length(c)-1 do with c[i] do Result:=Result + (head-cz);
  end;

...
Рейтинг: 0 / 0
Задачка про остров
    #39927196
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Соседних? Замкнутые контуры он как отработает?


Все ячейки по границе контура станут срезающими и срежут уровень внутри контура.

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


Это приведет к лишней работе по многократному срезу уровня в ячейках.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927204
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Остров мог быть не шестиугольный.
Это неважно, главное, что ячейки 6-ные.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927219
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Все ячейки по границе контура станут срезающими и срежут уровень внутри контура.

Внутри контура не обязательно все ниже, там могут быть дургие контуры, а в них еще контуры, не совсем понимаю каким образном наружные срежут все внутри, глубина лужи может быть маленькой, а лужа при этом очень высоко.

iOracleDev
Это приведет к лишней работе по многократному срезу уровня в ячейках.

Мы не будем рассматривать ячейки статус которых уже точно определен, по крайней мере описанный алгоритм логически понятен и даст верный результат, алгоритм с сортировкой по высоте меня сразу настораживает, каким образом он обработает многократно вложенные замкнутые контуры?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927224
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
Все ячейки по границе контура станут срезающими и срежут уровень внутри контура.

Внутри контура не обязательно все ниже, там могут быть дургие контуры, а в них еще контуры, не совсем понимаю каким образном наружные срежут все внутри, глубина лужи может быть маленькой, а лужа при этом очень высоко.

iOracleDev
Это приведет к лишней работе по многократному срезу уровня в ячейках.

Мы не будем рассматривать ячейки статус которых уже точно определен, по крайней мере описанный алгоритм логически понятен и даст верный результат, алгоритм с сортировкой по высоте меня сразу настораживает, каким образом он обработает многократно вложенные замкнутые контуры?


Для внутренних контуров будет все то же самое: когда срезание дойдет до ячейки внутреннего контура,
эта ячейка будет помечена как срезающая.

А сортировка по высоте значительно ускоряет работу.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927239
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсивный алгоритм можно еще упростить.
Специальный признак срезающей ячейки не требуется,
Вместо него можно использовать проверку на равенство
высоты ячейки и высоты уровня воды в этой ячейке.
Завтра приведу окончательный вариант.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927675
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь оптимизированный вариант решения:
1. Сортировка вставками заменена на сортировку подсчетом массива координат ячеек,
теперь сортировка почти не влияет на время работы.
2. Рекурсия заменена циклом, для возврата в прежнее состояние запоминаем 1-байтовое
направление, теперь нам не грозит переполнение стека на больших N.
3. Вычисление координат соседей выполняется непосредственно в теле процедуры SetLevel
с использованием массива констант, стало считать чуть быстрее.
4. Размеры структур уменьшены, чтобы можно было оценить время работы с ростом N,
теперь остров размером 10000х10000 считается за 6 сек.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
type
  THexagon= packed record
    Height: byte;
    Level: byte;
    Dir: byte;
    end;

  TCoordinates= packed record
    CX: word;
    CY: word;
    end;

const
  XCount= 10000;
  YCount= XCount;
  XYCount= XCount * YCount;

var
  HexMap: packed array[0..YCount-1, 0..XCount-1] of THexagon;
  Order: packed array[0..YCount*XCount-1] of TCoordinates;

procedure ReadHexMap;
var
  x, y: integer;
begin;
  RandSeed:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do HexMap[y,x].Height:=Random(256);
  end;

procedure SortHexMap;
var
  Counts: array[byte] of integer;
  h, x, y, sum, cnt: integer;
begin;
  for h:=Low(Counts) to High(Counts) do Counts[h]:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do inc(Counts[HexMap[y,x].Height]);
  sum:=0;
  for h:=Low(Counts) to High(Counts) do begin;
    cnt:=sum; sum:=sum+Counts[h]; Counts[h]:=cnt;
    end;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do begin;
    h:=HexMap[y,x].Height; cnt:=Counts[h]; Counts[h]:=cnt+1;
    with Order[cnt] do begin; CX:=x; CY:=y; end;
    end;
  end;

procedure SetLevel(y, x: integer);
const
  dx: array[0..5] of integer= (-1, +1,  0, +1, +1,  0);
  dy: array[0..5] of integer= ( 0,  0, -1, +1, -1, +1);
var
  i, x2, y2: integer;
  cut: byte;
begin;
  cut:=HexMap[y,x].Level;
  HexMap[y,x].Dir:=Length(dx);
  i:=0;
  while true do begin;
    while i<Length(dx) do begin;
      x2:=x+dx[i]; if i>=2 then x2:=x2 + y and 1 - 1;
      y2:=y+dy[i];
      if (cardinal(y2)<YCount) and (cardinal(x2)<XCount)
      then with HexMap[y2,x2] do if Level>cut then begin;
        if Height>cut then Level:=Height
        else begin;
          Level:=cut; Dir:=i xor 1; i:=-1;
          x:=x2; y:=y2;
          end;
        end;
      inc(i);
      end;
    i:=HexMap[y,x].Dir;
    if i>=Length(dx) then break;
    x:=x+dx[i]; if i>=2 then x:=x + y and 1 - 1;
    y:=y+dy[i];
    i:=i xor 1 + 1;
    end;
  end;

function FillWater: int64;
var
  i, x, y, MaxHeight: integer;
begin;
  ReadHexMap;
  SortHexMap;
  with Order[XYCount-1] do MaxHeight:=HexMap[CY,CX].Height;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do with HexMap[y,x] do
    if (y=0) or (y=YCount-1) or (x=0) or (x=XCount-1)
    then Level:=Height
    else Level:=MaxHeight;
  for i:=0 to XYCount-1 do with Order[i] do with HexMap[CY,CX] do
    if Level=Height then SetLevel(CY,CX);
  Result:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do with HexMap[y,x] do Result:=Result+(Level-Height);
  end;

...
Рейтинг: 0 / 0
Задачка про остров
    #39927683
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
теперь остров размером 10000х10000 считается за 6 сек.

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

оно совпало с предыдущими )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927687
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
оно совпало с предыдущими )

А с правильными совпало?))
...
Рейтинг: 0 / 0
Задачка про остров
    #39927688
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton правильную вещь предлагал, упростить до квадратов и использовать 22080256 .
...
Рейтинг: 0 / 0
Задачка про остров
    #39927690
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,

предыдущие были проверены на двух небольших примерах, посчитанных вручную.

Было здорово сравнить с другим автором, но где ж его взять )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927693
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
mayton правильную вещь предлагал, упростить до квадратов и использовать 22080256 .


1) нафига упрощать до квадратов? что мешает посто сдвинуть четные строки вправо и решать в шестиугольниках? тут изюминка в громадной рекурсии, от которой надо избавиться.

2) чем это лучше случайных данных или специального маленького замудренного примера? все равно придется эту хрень считать независимым способом.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927694
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

а можешь выложить карты и результаты к ним в виде файликов. Я планирую на неделе докодить свой вариант 22077648 и сразу сравнить. У тебя ведь 6-угольники? Надо утвердить формат карты )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927696
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

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

Декартова система координат с прямоугольной сеткой - легче визуализируется.

А визуализация даёт вам возможность контроля.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927707
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
шестиугольники тоже нормально визуализируются и контролируются
вот реальные результаты для острова 10х10
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Volume=18   Time=0
RandSeed=0   RandRange=10   XCount,YCount=10
Map=
0,0,8,2,2,6,3,1,3,4,
 0,4,0,8,0,2,9,3,7,3,
6,8,7,3,1,3,4,2,8,2,
 4,1,8,2,7,9,4,8,8,0,
1,1,5,0,5,0,7,6,7,7,
 5,2,6,5,9,6,9,2,6,2,
0,7,4,8,5,5,9,6,3,0,
 7,9,7,7,1,1,9,7,5,8,
6,2,0,6,2,8,1,2,5,9,
 1,1,2,1,5,4,2,1,6,7,
...
Рейтинг: 0 / 0
Задачка про остров
    #39927708
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

кстати я подумал, зачем передавать файлы?

Гораздо проще сравнивать результаты для 3х параметров, с помощью которых генерируем карту:
RandSeed, RandRange, XCount (YCount=XCount).

Процедура генерации карты:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure ReadHexMap;
var
  x, y: integer;
begin;
  RandSeed:=Seed;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do HexMap[y,x].Height:=Random(Range);
  end;



Связность ячеек понятна из моего предыдущего сообщения 22081766
...
Рейтинг: 0 / 0
Задачка про остров
    #39927709
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код датчика случайных чисел в Delphi
Код: pascal
1.
2.
3.
4.
5.
function Random(Range: integer): integer;
begin;
  RandSeed:=RandSeed * $08088405 + 1;
  Result:=int64(Range) * cardinal(RandSeed) shr 32;
  end;
...
Рейтинг: 0 / 0
Задачка про остров
    #39927711
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?
сверить результаты.

кстати, твой алгоритм сможет проглотить добавку от Майтона? 22077662
...
Рейтинг: 0 / 0
Задачка про остров
    #39927712
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?
сверить результаты.

кстати, твой алгоритм сможет проглотить добавку от Майтона? 22077662


Чтобы сверить результаты, достаточно передать 3 параметра, которые полностью определяют сгенерированный файл.

Добавку от Майтона он не проглотит, придется модифицировать одну строчку.

Ну и неясность некоторая имеется: волна высотой 3 перевалит через гору высотой 3 или нет?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927713
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?

Чтобы визуально оценить результат глядя на сгенерированную картинку, например загоняем файл
с теми вариантами которые хотим проверить, обсчитываем, генерим результирующую картинку и
сравниваем. Пример картинки 160x120 256 бит
...
Рейтинг: 0 / 0
Задачка про остров
    #39927783
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?

Чтобы визуально оценить результат глядя на сгенерированную картинку


У нас нет такой задачи как "визуально оценить".
Ну, оценил визуально: вроде похоже на то, что ожидается.
А что дальше: верно или неверно?

У нас 2 другие задачи.
1) отладить программу на заранее точно просчитанных примерах.
2) сравнить результаты участников.
Обе задачи можно решить, передавая параметры алгоритма генерации карты и ответ.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно.

Но чем бы вы не занимались и что-бы вы не программировали. А визуальная оценка корректности
резульатата нужна постоянно. И я сильно сомневаюсь что все из присутствующих пишут модульные
тесты.

А битмап я предлагал в совокупности с оптимизацией "островной задачи" с учотом возможностей
параллелизма.

Вы же не собираетесь оценивать параллелизм на этих мелких текстовых файлах?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927795
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как будет угодно.

Но чем бы вы не занимались и что-бы вы не программировали. А визуальная оценка корректности
резульатата нужна постоянно. И я сильно сомневаюсь что все из присутствующих пишут модульные
тесты.

А битмап я предлагал в совокупности с оптимизацией "островной задачи" с учотом возможностей
параллелизма.

Вы же не собираетесь оценивать параллелизм на этих мелких текстовых файлах?


Опять же: зачем пытаться параллелить все подряд?
Эта задача и параллелится плохо и ее решение в одном потоке
в максимальной размерности займет примерно 1 мин.
Тут это ни к чему.

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

Хотя внутренне - я с вами согласен. Графовые задачи вообще плохо параллелятся. В этом и челлендж.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928018
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
У нас нет такой задачи как "визуально оценить".
Ну, оценил визуально: вроде похоже на то, что ожидается.
А что дальше: верно или неверно?

У нас 2 другие задачи.
1) отладить программу на заранее точно просчитанных примерах.
2) сравнить результаты участников.
Обе задачи можно решить, передавая параметры алгоритма генерации карты и ответ.

Где взять заранее точно просчитанные примеры нужной сложности и имеющие именно тот рельеф
который нужно проверить?

Параметры генерации карты не дадут карту нужного рельефа, нам не нужна случайная карта,
нужна карта со специально нарисованным рельефом реализующим различные сложные случаи,
тестирование не делается случайным образом, при тестировании проверяют вполне конкретные
ситуации.

Визуализация даст и вам и остальным понять правильно ли отработал алгоритм конкретно заданный случай.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928038
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Где взять заранее точно просчитанные примеры нужной сложности и имеющие именно тот рельеф
который нужно проверить?


Хороший вопрос. У вас есть ответ?

iOracleDev

Параметры генерации карты не дадут карту нужного рельефа, нам не нужна случайная карта,
нужна карта со специально нарисованным рельефом реализующим различные сложные случаи,
тестирование не делается случайным образом, при тестировании проверяют вполне конкретные
ситуации.


Разумеется.

iOracleDev

Визуализация даст и вам и остальным понять правильно ли отработал алгоритм конкретно заданный случай.


Можно пример?
...
Рейтинг: 0 / 0
Задачка про остров
    #39928046
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Можно пример?

Выше нарисован. Было бы очень неплохо чтобы можно было скормить на обработку графический или ppm файл 256 градаций серого и получить на выходе файл у которого все пиксели оставшиеся под водой имеют белый цвет.


mayton,
Нет примера, как в java получить двумерный байт-массив из битмапа или ppm, второй наверное даже лучше?
...
Рейтинг: 0 / 0
Задачка про остров
    #39928051
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Выше нарисован.


цветастый он какой-то
...
Рейтинг: 0 / 0
Задачка про остров
    #39928060
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
цветастый он какой-то

сохранял как 256 градаций серого в свойствах 8 бит и по размеру похоже, не знаю почему он цветастый, в графике не разбираюсь))
...
Рейтинг: 0 / 0
Задачка про остров
    #39928061
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С ppm очень просто. Это текстовый файл. В бинарными форматами - вот образец. Записывает шум.
И пытается прочитать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
Random rnd = new Random();
for(int y =0;y<image.getHeight();y++) {
    for (int x = 0; x < image.getWidth(); x++) {
        int r = rnd.nextInt(256);
        int g = rnd.nextInt(256);
        int b = rnd.nextInt(256);
        image.setRGB(x,y, 0xFF_000000 | r << 16 | g << 8 | b);
    }
}
ImageIO.write(image, "PNG", new FileOutputStream("test.png"));
BufferedImage image2 = ImageIO.read("test.png");
image.getRGB(0,0); 
// .....



Для серого - будет тоже самое наверное только тип картинки поставить в TYPE_BYTE_GRAY.
Но я с ним не работал.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPM хорошо описан тут https://ru.wikipedia.org/wiki/Portable_anymap
...
Рейтинг: 0 / 0
Задачка про остров
    #39928077
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev

Было бы очень неплохо ... получить на выходе файл у которого все пиксели оставшиеся под водой имеют белый цвет.


При отладке без графической визуализации я получаю даже больше,
выводя в мемо количество воды, которое набрал каждый шестиугольник матрицы.

В общем, каждый отлаживается на свой вкус и цвет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928082
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно. Я просто в этой задаче увидел элемент технологии из game-dev.

Поэтому художнику по дизайну ландшафтов будет очень презентативно увидеть результат как его показывают
такие приложения как CorelBryce, RealWorldTerran e.tc.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928315
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Имя пользователя1


кстати, твой алгоритм сможет проглотить добавку от Майтона? 22077662


Добавку от Майтона он не проглотит, придется модифицировать одну строчку.

Ну и неясность некоторая имеется: волна высотой 3 перевалит через гору высотой 3 или нет?
нет, не перевалит. Так логичнее, по моему)
...
Рейтинг: 0 / 0
Задачка про остров
    #39928333
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
Aleksandr Sharahov
пропущено...


Добавку от Майтона он не проглотит, придется модифицировать одну строчку.

Ну и неясность некоторая имеется: волна высотой 3 перевалит через гору высотой 3 или нет?
нет, не перевалит. Так логичнее, по моему)


Тогда рассмотрим оба варианта, при условии, что вода поднимается до уровня 3.

1. Когда перевалит.
Заливаем всю карту водой без ограничений.
Если теперь мы просуммируем воду по всем ячейкам, то получим решение исходной задачи,
а если просуммируем по ячейкам, в которых уровень воды равен 3 и ниже, то получим решение для Майтон-1.
Ведь в этом варианте ячеек с уровнем воды 4 и выше просто не может быть.

2. Когда не перевалит. Рассуждаем аналогично.
Если просуммируем по ячейкам, в которых уровень воды равен 2 и ниже, то получим решение для Майтон-2.
Ведь в этом варианте ячеек с уровнем воды 3 и выше просто не может быть.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928423
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

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

В словесном описании есть алгоритм?


Попробую суммировать здесь.

Данные ячейки:
H=высота, L=уровень воды.

1. Инициализация.
Читаем карту высот, присваивая H.
В каждой ячейке на границе карты полагаем L:=H, в остальных L:=+бесконечность

2. Заполнение водой.
Обходим все ячейки в цикле в порядке возрастания H.
Для задачи в формулировке Майтона обход заканчиваем досрочно
при встрече первой ячейки с H=M (уровень прилива).
Если в процессе обхода обнаружим, что у ячейки L=H,
то вызываем процедуру среза, передавая эту ячейку параметром.

3. Подсчет объема воды.
Для задачи в исходной формулировке суммируем все разности (L-H),
для формулировки Майтона суммируем только те разности, у которых L<M.

Процедура среза.
Устанавливаем уровень среза C=L ячейки-параметра.
Для всех ячеек-соседей, у которых L>C, делаем одно из двух:
а) если H>C, то устанавливаем L:=H
б) иначе устанавливаем L:=C и вызываем для этого соседа процедуру среза.

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

1. Чтоб эффективно параллелить обработку матрицы высот (HeightMatrix) мне нужна гарантия
что каждый процесс (поток) владеет своей частичкой матрицы.

2. Если остров представлен квадратной матрицей - то мы его можем разделить на 4 квадранта.
Как разделить? Провести искусственную высоту равную +MAX_INT по вертикали и по горизонтали через центр.

3. Можно применить алгортм заливки водой каждого квадратнта одновременно (4 процесса запроцессят каждый
свою матрицу данных).

4. После финала 4х процессов я убираю искусственные стенки. Я их понижаю до исходного уровня.
И повторяю 1 общий алгоритм для всего острова.

5. Моя идея базируется на предположении что 80% работы по переливанию воды уже выполнены на шаге (3)
и осталось только слегка подкорректировать водичку в "кратерах" и "ямках".
...
Рейтинг: 0 / 0
Задачка про остров
    #39928530
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По визуализации.

Та чёрно-белая картинка которую я запостил - неудачна. Она представляет собой гору. А мне нужно
архипеллаг островов. И желательно с ямками. Побольше ямок.

Для визуализации алгорима желательно Grayscale картинку трансформировать в географическую. С цветовой
маркировкой как принято в картографии.

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

...
Рейтинг: 0 / 0
Задачка про остров
    #39928542
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я думаю о параллелизме острова...


Идея очевидная, и легко реализуемая.
Но отсутствует гарантия ускорения, можно нарваться на полный пересчет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928543
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Я думаю о параллелизме острова...


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

Ну это то о чем я говорил. Графовые алгоритмы вообще *уево параллелятся. Но
нам повзло. У нас есть некая пространственная когерентность. Тоесть группа вершин
может быть легко разделена или сгруппирована по декартовому признаку.

В полно-связном графе например это сделать нельзя. А в для 6-связного (хексагоны) или для 4 связной вершины
(пиксели) - очень даже удобно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928545
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
iOracleDev
Aleksandr Sharahov,

В словесном описании есть алгоритм?


Попробую суммировать здесь.

Данные ячейки:
H=высота, L=уровень воды.

1. Инициализация.
Читаем карту высот, присваивая H.
В каждой ячейке на границе карты полагаем L:=H, в остальных L:=+бесконечность

2. Заполнение водой.
Обходим все ячейки в цикле в порядке возрастания H.
Для задачи в формулировке Майтона обход заканчиваем досрочно
при встрече первой ячейки с H=M (уровень прилива).
Если в процессе обхода обнаружим, что у ячейки L=H,
то вызываем процедуру среза, передавая эту ячейку параметром.

3. Подсчет объема воды.
Для задачи в исходной формулировке суммируем все разности (L-H),
для формулировки Майтона суммируем только те разности, у которых L<M.

Процедура среза.
Устанавливаем уровень среза C=L ячейки-параметра.
Для всех ячеек-соседей, у которых L>C, делаем одно из двух:
а) если H>C, то устанавливаем L:=H
б) иначе устанавливаем L:=C и вызываем для этого соседа процедуру среза.

Понятно, что от рекурсии в процедуре среза можно избавиться.
Доказательство корректности алгоритма оставляю читателю )
два вопроса)

1) основное отличие от 22079233 - там каждый раз ищется подходящая ячейка на п.4 и далее обрабатывается, а у тебя в процедуре среза в пункте (б) начинается рекурсия с обработкой соседних ячеек?

2) рекурсия заменена либо на "поиск в ширину" (с очередью), либо на "поиск в глубину" (со стеком)?
...
Рейтинг: 0 / 0
Задачка про остров
    #39928571
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
Aleksandr Sharahov
пропущено...


Попробую суммировать здесь.

Данные ячейки:
H=высота, L=уровень воды.

1. Инициализация.
Читаем карту высот, присваивая H.
В каждой ячейке на границе карты полагаем L:=H, в остальных L:=+бесконечность

2. Заполнение водой.
Обходим все ячейки в цикле в порядке возрастания H.
Для задачи в формулировке Майтона обход заканчиваем досрочно
при встрече первой ячейки с H=M (уровень прилива).
Если в процессе обхода обнаружим, что у ячейки L=H,
то вызываем процедуру среза, передавая эту ячейку параметром.

3. Подсчет объема воды.
Для задачи в исходной формулировке суммируем все разности (L-H),
для формулировки Майтона суммируем только те разности, у которых L<M.

Процедура среза.
Устанавливаем уровень среза C=L ячейки-параметра.
Для всех ячеек-соседей, у которых L>C, делаем одно из двух:
а) если H>C, то устанавливаем L:=H
б) иначе устанавливаем L:=C и вызываем для этого соседа процедуру среза.

Понятно, что от рекурсии в процедуре среза можно избавиться.
Доказательство корректности алгоритма оставляю читателю )
два вопроса)

1) основное отличие от 22079233 - там каждый раз ищется подходящая ячейка на п.4 и далее обрабатывается, а у тебя в процедуре среза в пункте (б) начинается рекурсия с обработкой соседних ячеек?

2) рекурсия заменена либо на "поиск в ширину" (с очередью), либо на "поиск в глубину" (со стеком)?


1) Отличий много, и да, у меня начинается рекурсия.
2) Пофигу, у меня цикл в глубину с запоминанием направления возврата.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929196
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял картинку 22077693 , инвертировал (у меня чем более темный пиксель тем больше высота, так воспринимать картинку лучше), обработка с параметрами 30 - уровень океана после отлива, 100 - уровень до которого поднималась вода. Картинку для форума пережал в jpg меньшего размера, на ней много артефактов сжатия.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929230
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,

визуально)
но из-за сжатия невозможно оценить правильность работы
...
Рейтинг: 0 / 0
Задачка про остров
    #39929235
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

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

Погонял по высотам и по своим картинкам с концентрическими системами, вполне себе адекватно работает, правда медленно.


у меня 22083065 самый быстрый из 3х проверенных, его гонял?
...
Рейтинг: 0 / 0
Задачка про остров
    #39929382
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
iOracleDev
Aleksandr Sharahov,

Погонял по высотам и по своим картинкам с концентрическими системами, вполне себе адекватно работает, правда медленно.


у меня 22083065 самый быстрый из 3х проверенных, его гонял?

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

ты не понял: имелось в виду из 3х *моих* проверенных
...
Рейтинг: 0 / 0
Задачка про остров
    #39929394
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton,

ты не понял: имелось в виду из 3х *моих* проверенных

Ладно не обижайся. Я шучу. Пятница все таки.

Над параллелизмом думал?
...
Рейтинг: 0 / 0
Задачка про остров
    #39929397
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
у меня 22083065 самый быстрый из 3х проверенных, его гонял?

Нет конечно, гонял свой с последовательными срезами сверху, правда считал не на массиве а на связном списке узлов, внутри узла массив из соседей и геттер, плюс очередь использовал, просто на массиве должно быть намного быстрее. Сложность алгоритма K*N, где K - количество уровней, N - количество плиток, распарралелить думаю не получится, следующий уровень зависит от предыдущего, хотя надо подумать, наверное можно посчитать каждый срез как будто он единственный, а потом последовательно наложить начиная сверху, тогда распараллелится очень хорошо.

Твой я не понимаю, за счет чего он должен выбираться из кратеров? Ты для каждой плитки ищешь выход в океан? Как определяешь что не попал в loop по плиткам? Как выходишь за пределы стены кратера, при условии неограниченной вложенности кратеров и их уровней? Сколько проходов по каждой плитке и от чего зависит, какая временная сложность алгоритма?
...
Рейтинг: 0 / 0
Задачка про остров
    #39929399
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
ты не понял: имелось в виду из 3х *моих* проверенных

Берешь картинку и вперед)) картинка от mayton-а не очень хорошая для проверки, она большая но сложных случаев, чтобы было сразу видно ошибки, на ней нет.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929414
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Над параллелизмом думал?


А что там думать, трясти надо. Если на 4 части резать, то:
1) для каждого из 4 квадратов решаем немного измененную задачу со срезающими
ячейками только по 2 внешним сторонам (результат не подсчитываем),
2) объединяем соседние решения по 2, запуская процедуру среза и примыкающих ячеек,
3) объединяем половинки, запуская процедуру среза и примыкающих ячеек.
4)считаем результат

Но мне интереснее отжать текущую реализацию без разрезаний.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929418
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
3) объединяем половинки, запуская процедуру среза и примыкающих ячеек.

Если ячейка из середины одной секции имеет выход в океан через пару других секций?
...
Рейтинг: 0 / 0
Задачка про остров
    #39929419
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Над параллелизмом думал?


А что там думать, трясти надо. Если на 4 части резать, то:
1) для каждого из 4 квадратов решаем немного измененную задачу со срезающими
ячейками только по 2 внешним сторонам (результат не подсчитываем),
2) объединяем соседние решения по 2, запуская процедуру среза и примыкающих ячеек,
3) объединяем половинки, запуская процедуру среза и примыкающих ячеек.
4)считаем результат

Но мне интереснее отжать текущую реализацию без разрезаний.

Хорошо. Отжимай. Я попробую на этих выходных что-то написать.

Неделька выдалась бешеная. Этой задаче я мог эпизодически уделять по 5 мин времени в сутки. +У меня еще
штук 5 интересов "около" этого.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929422
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Твой я не понимаю, за счет чего он должен выбираться из кратеров?
Ты для каждой плитки ищешь выход в океан?
Как определяешь что не попал в loop по плиткам?
Как выходишь за пределы стены кратера, при условии неограниченной вложенности кратеров и их уровней?
Сколько проходов по каждой плитке и от чего зависит, какая временная сложность алгоритма?


1. Выход из кратера за счет того, что его "берега" выше "долины",
значит, они будут помечены как точки среза,
от которых потом будут образованы новые срезы.

2. Зацикливания нет, т.к. мы все время идем в сторону увеличения уровня
при вызове процедуры среза и внутри нее.

3. Выход за пределы стены с помощью стены, т.к. новый срез образуется из нее.

4. Один проход по каждой плитке (1 срезание), хотя проверок от соседей может быть больше.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929425
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
А что там думать, трясти надо. Если на 4 части резать, то:
1) для каждого из 4 квадратов решаем немного измененную задачу со срезающими
ячейками только по 2 внешним сторонам (результат не подсчитываем),
2) объединяем соседние решения по 2, запуская процедуру среза и примыкающих ячеек,
3) объединяем половинки, запуская процедуру среза и примыкающих ячеек.
4)считаем результат
кейс: остров с высокими краями-стенами (черная), низиной внутри (коричневая), а в красной точке находится самая низкая точка стены.
3 четвертинки придется пересчитывать по уровню затопления, когда будем объединять.
То есть ничего не выигрываем в данном случае.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929426
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
3) объединяем половинки, запуская процедуру среза и примыкающих ячеек.

Если ячейка из середины одной секции имеет выход в океан через пару других секций?


Для моего алгоритма это не важно.
Все возможные срезы для каждой части были сделаны независимо,
теперь надо выполнить их диффузию в соседние части.

Я не утверждаю, что это быстро, но это даст правильный результат.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929428
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Сколько проходов по каждой плитке и от чего зависит, какая временная сложность алгоритма?
временная сложность на данный момент линейная, но только на предположении, что все высоты - целые от 0 до 256. Если их сделать вещественными, алгоритм вернется к своему "законному" O(n*ln(n))
...
Рейтинг: 0 / 0
Задачка про остров
    #39929430
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

а я и утверждаю, что будет выигрыш.

Например, со спиралькой ваще кранты
...
Рейтинг: 0 / 0
Задачка про остров
    #39929491
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте я в топике, как архивариус соберу различные маргинальные тест кейсы "острова".
Мы подыщем для них картинки и будеем использовать как

1. Синтетические тесты.
  • Прямоугольная плоскость (Plane)
  • Бассейн (Pool)
  • Случайный шум. Острые пики. (Noise-map)
  • Прямоугольная пирамида с вершиной в центре карты (Pyramid)
  • Спираль (Spyro)
  • Лабиринт с стенами одинаковой высоты (Maze)
2. Приближенные к реальным.
  • Классический остров-гора. Монотонный. (Mountain)
  • Остров с кратером потухшего вулкана. (Volcano)
  • Архипеллаг мелких островов разделенных океаном. (Islands)
  • e.t.c. (+еще побольше вариаций)

При любых профилях карты океан всегда омывает и затапливает крайние пиксели по бордюру.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со ссылкой на голосование У кого какое разрешение моника . Большинство мембером имеют моник Full-HD и я надеюсь
что они нормально отображают на скрине картинку с разрешением 1024х1024 на
уровне пиксельной точности.

Выше создавать нет смысла т.к. она будет либо не кратная степени двойки либо будет
отфильтрована фильтрами низкой частоты что сведет на нет ваши усилия по расчету
конкретных отдельно стоящик пикселов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929553
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
iOracleDev
Сколько проходов по каждой плитке и от чего зависит, какая временная сложность алгоритма?
временная сложность на данный момент линейная, но только на предположении, что все высоты - целые от 0 до 256. Если их сделать вещественными, алгоритм вернется к своему "законному" O(n*ln(n))


Не совсем так.
O(n*ln(n)) - это только на этапе сортировки сравнениями. Если подойдет подсчет или радикс, то O(n).
На остальных этапах - O(n), т.к. количество заходов в каждую ячейку фиксировано.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929555
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Имя пользователя1,

а я и утверждаю, что будет выигрыш.

Например, со спиралькой ваще кранты


а я и НЕ утверждаю, что будет выигрыш.

Например, со спиралькой ваще кранты
...
Рейтинг: 0 / 0
Задачка про остров
    #39929600
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более упрощенная задача проскакивала на хабре, более того, там было решение в 1 проход, сдесь немного сложнее, как минимум грани и мерность другая
https://habr.com/ru/post/200190/
...
Рейтинг: 0 / 0
Задачка про остров
    #39929611
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. Монотонность "слева". Пересекается с монтонностью "справа".

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

3. Выход за пределы стены с помощью стены, т.к. новый срез образуется из нее.

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

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

Я бы делал не так, собственно и сделал не так, остров имеет высоту от 0 до 255, при этом остаточный уровень воды может быть выше 0, т.е часть острова может остаться затопленной полностью. Ячейки на одном уровне с уровнем океана после отлива сухие.

Я не то имел в виду. Если вы пойдете на хитрость и создадите "куб" c высотой 255 и размерами например 1024х1024
а уровень океана поднимем на высоту например 300 то по идее ваш куб должен быть затоплен сверху. Эдакий себе
всемирный потоп.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929624
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
2. Зацикливания нет, т.к. мы все время идем в сторону увеличения уровня
при вызове процедуры среза и внутри нее.

3. Выход за пределы стены с помощью стены, т.к. новый срез образуется из нее.

Площадка ниже остаточного уровня воды в кратере который ниже уровня подъема воды, однако этот кратер внутри дургого кратера, т.е. сначала подъем на стену, потом спуск и снова подъем, который уже выше уровня подъема воды, т.е. все что внутри должно оказаться сухим.


Алгоритм пометит высокие ячейки как новые точки среза,
но срезать по ним не будет, так как обход будет завершен досрочно
на ячейке с высотой меньше уровня прилива.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929626
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot mayton#22084832]
iOracleDev
Я не то имел в виду. Если вы пойдете на хитрость и создадите "куб" c высотой 255 и размерами например 1024х1024
а уровень океана поднимем на высоту например 300 то по идее ваш куб должен быть затоплен сверху. Эдакий себе
всемирный потоп.

В исходной постановке и был всемирный потоп, потом добавили произвольный уровень максимального подъема воды, а я еще добавил и уровень океана, который после отлива может быть выше какой то части острова.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел достигнуть договоренностей о краевых условиях алгоритма. Тоесть когда океану
нет места на карте - океан считается пограничными пикселями с координанами например (-1,-1), (+1024,+1024)
для моей карты.

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

Остров ограничен краями прямоугольника, снаружи только океан, внутри все считается островом, но он может быть под водой, например уровень океана 1, минимальная высота плитки острова 0, часть острова навсегда останется под водой. Т.е. я к тому что уровень океана тоже можно двигать, как и уровень наводнения.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929629
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot iOracleDev#22084843]
mayton
пропущено...

В исходной постановке и был всемирный потоп, потом добавили произвольный уровень максимального подъема воды, а я еще добавил и уровень океана, который после отлива может быть выше какой то части острова.


На мой взгляд, уровень отлива - лишнее условие, т.к. оно равносильно тому,
что все "краевые" точки острова и их соседи (и соседи соседей...)
приподнимаются до уровня отлива, если их не считать точками острова.
А если считать, то и дно океана надо считать.
К тому же это можно свести к разности 2х задач с 2 разными приливами.

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

По мне это - одно и тоже в топике.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929634
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я вообще не понимаю зачем вы различаете уровень океана и прилива или наводнения.

По мне это - одно и тоже в топике.


Ну ты склеротик: 22077662 ))
...
Рейтинг: 0 / 0
Задачка про остров
    #39929639
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно забей. Проехали.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929693
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще несколько мыслей - дополнений по условию наших тестов.

1. Одна и та-же карта. И один и тото-же инстанс алгоритма могут быть (и должны) использоваться несколько раз за сеанс.
Тоесть наш алгоритм это автомат с состоянием.
2. Приливы и отливы на острове должны иметь колебательный характер с неким повышением среднего.
(Помните постановку с кратером внутри кратера?)
3. Для диапазона географических высот от 0 до 255 условных единиц мы
4. Остров с круглыми стенами (Колизей или цирк) который предложил Имя пользователя1
я тоже включаю в коллекцию синтетических ландшафтов. Он пригодится для краш-тестов.
5. Исходные данные островов будут представлены как картинками (PNG) так и Comma-Separated файлами для удобства
модульных тестов или каких-то проверок.

Отпишите ваши каменты если вы с чем-то не согласны.

Возможно к выходным я выкачу свой алгоритм. Но... я попробую написать его на Rust. А от этого
моя чортова эффективность как кодера понизится Увы. Придется спешить с справочником в одной руке.

Для наглядности наши карты должны иметь хоть какой-то 3D вид. Кто из участников знает Blender или 3DMax
чтоб хотя-бы визуализировать их внешний вид в изометрии. И не в сереньком виде а в виде географической
раскраски высот. КМК гео-палитра наиболее наглядна. Да и привыкли мы к ней все.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929746
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая вот коллекция вулканических островов есть.
Пока главные недостаток - разные размеры и разные форматы.
И есть анизотропность. Не все имеют пропорции 1:1. Но это я пофикшу
в оффлайне.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929747
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это - технические данные. Как видите - зоопарк форматов. Для общности я сделаю копию PPM для каждого и эту копию
положу в gzip чтоб легче качат.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
.: directory
./image-2048x2048.png: PNG image data, 2048 x 2048, 8-bit/color RGBA, non-interlaced
./BritanniaHeightMap2-200x200.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 200x200, segment length 16, baseline, precision 8, 1024x1024, frames 3
./canyons-01-2048x2048.png: PNG image data, 2048 x 2048, 8-bit/color RGB, non-interlaced
./volcano.png: PNG image data, 256 x 256, 8-bit grayscale, non-interlaced
./dah8mdt-7156d41d-297b-4cda-bed2-45f9715b98fe.png: PNG image data, 513 x 513, 8-bit grayscale, non-interlaced
./Pits-n-rocks-512x512.png: PNG image data, 512 x 512, 8-bit/color RGB, non-interlaced
./volcano-height-map-258-0_large.png: PNG image data, 800 x 800, 8-bit/color RGBA, non-interlaced
./images.jpeg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 224x225, frames 3
./cloud-2048x2048.jpg: JPEG image data, baseline, precision 8, 2048x2048, frames 3
./volcano-04.png: PNG image data, 1024 x 1024, 8-bit grayscale, non-interlaced
./Terrain-Heightmap-512x512.png: PNG image data, 512 x 512, 8-bit/color RGB, non-interlaced
./cape-512x512.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 97x97, segment length 16, progressive, precision 8, 512x512, frames 1
./jds2Fx6.png: PNG image data, 563 x 565, 8-bit/color RGBA, non-interlaced
./volcano-03.jpeg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 225x225, frames 3
./volcano-02.jpeg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 225x225, frames 3
./canyon-1081x1081.png: PNG image data, 1081 x 1081, 16-bit grayscale, non-interlaced
./island-03.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: "CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 100", baseline, precision 8, 423x378, frames 3
./heightmap.jpeg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 96x96, segment length 16, baseline, precision 8, 640x480, frames 3
./layers-512x512.png: PNG image data, 512 x 512, 8-bit/color RGB, non-interlaced



Синтетические картинки (пирамиды и бассейны и плато) я нагенерирую быстро.

Однако спираль и лабиринт - отдельная тема. Спираль напрямую у меня не получается.
Вида функция f(x,y). Надо делать параметрически.

Лабиринт - скорее всего найду готовый. Главное чтоб разрешение было хорошее.
Думаю что лабиринт будет самым суровым краш-тестом по времени на наши алгоритмы.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929753
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Лабиринт - скорее всего найду готовый. Главное чтоб разрешение было хорошее.
Думаю что лабиринт будет самым суровым краш-тестом по времени на наши алгоритмы.


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

Я добалю ее в каталог рельефов. А если такой лабиринт процедурально наложить на конус такого-же радиуса - то
мы получим такую себе Вавилонскую башню куда вода будет затекать последовательно по всему лабиринту.
...
Рейтинг: 0 / 0
Задачка про остров
    #39929791
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public class Node {

    public final int NUMBER_OF_NEIGHBOURS;
    private int height;
    private char status;

    private Node[] neighbours;

    public Node(int height) {
        this(height, 4);
    }

    public Node(int height, int NUMBER_OF_NEIGHBOURS) {
        this.NUMBER_OF_NEIGHBOURS = NUMBER_OF_NEIGHBOURS;
        this.height = height;
        this.neighbours = new Node[this.NUMBER_OF_NEIGHBOURS];
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setNeighbours(Node[] neighbours) {
        this.neighbours = neighbours;
    }

    public Node getNeighbour(int neighbour) {
        return neighbours[neighbour];
    }

    public void setNeighbour(int neighbour, Node node) {
        this.neighbours[neighbour] = node;
    }

    public char getStatus() {
        return status;
    }

    public void setStatus(char status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}



Превращение картинки в массив и обратно
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class GrayRgbBmpArray {

    public final int mask = 0b00000000_00000000_00000000_11111111;
    public int[][] imageInByte;
    public int[][] outputArray;
    private String fullInputFileName;
    private String fullOutputFileName;
    private BufferedImage originalImage;

    public GrayRgbBmpArray(String fullInputFileName, String fullOutputFileName) {
        this.fullInputFileName = fullInputFileName;
        this.fullOutputFileName = fullOutputFileName;
    }

    static BufferedImage deepCopy(BufferedImage bi) {
        ColorModel cm = bi.getColorModel();
        boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
        WritableRaster raster = bi.copyData(null);
        //System.out.println(cm.toString() + " " + raster.toString());
        return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
    }

    public void readToArray() {
        try {
            originalImage = ImageIO.read(new File(fullInputFileName));
            imageInByte = new int[originalImage.getHeight()][originalImage.getWidth()];
            outputArray = new int[originalImage.getHeight()][originalImage.getWidth()];
            int input, blue_channel, invert;
            for (int i = 0; i< originalImage.getHeight(); i++) {
                for (int k = 0; k < originalImage.getWidth(); k++) {
                    input = originalImage.getRGB(k, i);
                    //System.out.println(Integer.toBinaryString(input));
                    blue_channel =  input & mask;
                    invert = blue_channel ^ mask;
                    //System.out.println(invert);
                    imageInByte[i][k] = invert;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void writeToFile(int underWaterColorX, int  underWaterColorY) {
        if (outputArray == null || outputArray.length == 0 || outputArray[0].length == 0) {
            System.out.println("Нет данных для вывода в файл");
            return;
        }

        int height = outputArray.length;
        int width = outputArray[0].length;
        int blue_channel;
        // координаты пикселя исходного изображения с которого берется цвет для закраски затопленных плиток
        int underWaterColor = originalImage.getRGB(underWaterColorX, underWaterColorY);
        // результирующую картинку создаем как копию исходной
        BufferedImage image = deepCopy(originalImage);

        for (int i = 0; i < height; i++) {
            for (int k = 0; k < width; k++) {
                if (outputArray[i][k] == -1) {
                    // для затопленных плиток высота установлена в -1
                    image.setRGB(k,i, underWaterColor);
                } else {
                    blue_channel = outputArray[i][k]^mask;
                    image.setRGB(k,i, 0b11111111_00000000_00000000_00000000
                            | blue_channel << 16 | blue_channel << 8 | blue_channel);
                }
            }
        }

        try {
            ImageIO.write(image, "bmp", new FileOutputStream(fullOutputFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



Сам расчет, на входе массив, на выходе тоже массив
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
    public static int[][] Calculate(int[][] inputArray, int oceanLevel, int maxLevel) {
        // oceanLevel - уровень океана, ячейки граничащие с океаном на этом уровне сухие
        // maxLevel - максимальный уровень подъема воды
        if (inputArray == null || oceanLevel < 0 || maxLevel < oceanLevel) {
            System.out.println("Неконсистентные параметры");
            return null;
        }

        // массив четырехсвязных узлов (плиток)
        int height = inputArray.length;  // строки
        int width = inputArray[0].length; // столбцы
        Node[][] nodes = new Node[height][width];

        int underWater = oceanLevel - 1;
        int maxIslandLevel = 0;

        // заполняем массив узлами
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                nodes[i][k] = new Node(inputArray[i][k]);
                nodes[i][k].setStatus('n');  // статус еще не определялся
                // определяем максимальную высоту (уровень) острова
                if (inputArray[i][k] > maxIslandLevel) {
                    maxIslandLevel = inputArray[i][k];
                }
            }
        }

        // если заданный уровень океана выше уровня острова, нет смысла считать пустые слои
        int startLevel;
        if (maxIslandLevel < maxLevel) {
            startLevel = maxIslandLevel;
        } else {
            startLevel = maxLevel;
        }

        // записываем связи узлов
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                nodes[i][k].setNeighbours(new Node[] {  (k > 0) ? nodes[i][k-1] : null,
                                                        (i > 0) ? nodes[i-1][k] : null,
                                                        (k+1 < width) ? nodes[i][k+1] : null,
                                                        (i+1 < height) ? nodes[i+1][k] : null } );
            }
        }

        char st;  // переменная для кеширования статуса
        Node tmpNode; // переменная для кеширования узла
        Node nextNode; // в эту переменную сохраняем следующий узел при обходе периметра
        Node neighbourNode; // переменная для перебора соседей

        Queue<Node> queue = new LinkedList<>();
        for (int currentLevel = startLevel; currentLevel > underWater ; currentLevel--) {
            // на каждом уровне для каждой плитки ниже текущего уровня от периметра проводим поиск в ширину,
            // если она ниже текущего уровня и не имеет установленных постоянных статусов, то ставим временный
            // статус w - под водой, плитки раные текущему уровню или превышающие его не переходим
            // они являются барьером на текущем уровне
            queue.clear(); // очередь для поиска в ширину

            // обходим периметр и помещаем его в очередь на поиск в ширину
            tmpNode = nodes[0][0];
            int direction = 2; // начинаем идти вправо из нулевого узла
            while (tmpNode != null) {
                st = tmpNode.getStatus();
                if (st != 'D' && st != 'W' && tmpNode.getHeight() < currentLevel) {
                    tmpNode.setStatus('w');
                    queue.add(tmpNode);
                }

                nextNode = tmpNode.getNeighbour(direction);
                // если дошли до конца измерения, меняем направление на следующее
                if (nextNode == null) {
                    if (direction == 2) {
                        direction = 3;
                    }
                    else if (direction == 3)
                    {
                        direction = 0;
                    }
                    else if (direction == 0)
                    {
                        direction = 1;
                    } else {
                        break;
                    }
                    nextNode = tmpNode.getNeighbour(direction);
                }
                tmpNode = nextNode;
            }

            int processedNodes = queue.size();
            // выполняем для очереди поиск в ширину добавляя следующие узлы для обхода в очередь
            while (!queue.isEmpty()) {
                tmpNode = queue.poll();
                for (int j = 0; j < tmpNode.NUMBER_OF_NEIGHBOURS; j++) {
                    neighbourNode = tmpNode.getNeighbour(j);
                    if (neighbourNode == null) {
                        continue;
                    }

                    st = neighbourNode.getStatus();
                    if (st == 'w' || st == 'D' || st == 'W' || neighbourNode.getHeight() >= currentLevel) {
                        continue;
                    }
                    neighbourNode.setStatus('w');
                    queue.add(neighbourNode);
                    processedNodes++;
                }
            }

            System.out.println("Level = " + currentLevel + ",  processedNodes = " + processedNodes);

            // все плитки не имеющие постоянного статуса D (dry) или W (wet) и не имеющие временного
            // статуса w получают постоянный статус, статус w сбрасывается в u - unknown
            for (int i = 0; i < height; i++ ) {
                for (int k = 0; k < width; k++) {
                    tmpNode = nodes[i][k];
                    st = tmpNode.getStatus();
                    if (st == 'D' || st == 'W') {
                        continue;
                    }

                    if (tmpNode.getHeight() == currentLevel) {
                        tmpNode.setStatus('D');
                    } else if (st == 'w') {
                        tmpNode.setStatus('u');
                    } else if (currentLevel == maxLevel) {
                        tmpNode.setStatus('D');
                    } else {
                        tmpNode.setStatus('W');
                    }
                }
            }
        }

        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                // плитки не получившие постоянный статус и находящиеся ниже уровня океана
                tmpNode = nodes[i][k];
                st = tmpNode.getStatus();
                if (st != 'D' && st != 'W') {
                    tmpNode.setStatus('W');
                }
            }
        }

        // формируем результирующий массив
        int[][] outputArray = new int[height][width];
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                tmpNode = nodes[i][k];
                if (tmpNode.getStatus() == 'W') {
                    outputArray[i][k] = -1;
                } else {
                    outputArray[i][k] = tmpNode.getHeight();
                }
            }
        }

        return outputArray;
    }
}



Использование:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        // на входе нужен файл с 8-битной глубиной цвета и использованием 256 градаций серого, если хочется чтобы 
        // затопленные плитки имели цвет отличный от градаций серого, можно добавить цветной пиксель
        GrayRgbBmpArray grba = new GrayRgbBmpArray("C:\\temp\\test.bmp", "C:\\temp\\output.bmp");
        // считываем исходную картинку в массив
        grba.readToArray();
        // расчет, остаточный уровень океана может быть от 0 до 255, максимальный уровень подъема при наводнении от 0 до инта
        // если нужно затопить весь отсров уровень должен быть больше 255
        // можно устанавливать равные, тогда получим вид острова затопленного до определенной высоты
        // если собрать последовательно сверху такие срезы, то можно сделать гифку отлива))
        grba.outputArray = Island.Calculate(grba.imageInByte, 1, 260);
        // выводим результат в файл, цвет для затопленных плиток берется от пикселя исходной картинки с координатами (0,0)
        // можно указать любую другую координату для цветного пикселя в исходном файле
        grba.writeToFile(0, 0);


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

Сам можешь поиграться, ты же жавист, или давай картинку и параметры - уровень океана после отлива и уровень наводнения.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930260
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
...
Рейтинг: 0 / 0
Задачка про остров
    #39930275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шикарно. А время мерял? Учитывая что java имеет фазу прогрева методов надо сделать штук 20 вызовов
при поднятом приложении чтоб гарантировать что JIT поднялся и собрал методы в нативный код.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930280
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Java и скорость инженерных расчетов несовместимые вещи, ели нужна скорость, нужно убирать ноды, убирать очередь и делать ее самописную на обычном одномерном массиве, в общем делать монолит без дерганья объектов и функций, тогда можно говорить о скорости.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930283
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асимптоматику я могу глазами увидеть и в VisualBasic и в Assembler.
Мне только нужно 3-4 точки измерений алгоритма с разным объемом N и отклики по времени.
Тоесть наличие или отсуствие в стеке Java никак не влияет на форму этого графика.

Здесь конечно Шарахову удобнее. У него - статически компилируемый язык.
Но топик ведь посвящен алгоритмизации. Поэтому хороший алгоритм на Java
может быть быстрее чем плохой на Delphi.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930287
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

O(K*N), один срез считается за O(N), недостаток - зависимость от количества уровней, хотя благодаря этому недостатку его можно распараллелить, можно посчитать срезы, а потом просто последовательно наложить один на другой начиная сверху. Можно пройтись срезами снизу вверх складывая каждый срез в файл, потом сверху вниз, сделать из этого гифку, получится анимированный прилив и отлив))
...
Рейтинг: 0 / 0
Задачка про остров
    #39930288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй сделать просто последовательность *png файлов. А дальше можно из нее сделать анимацию.
У меня где-то был скриптик с ffmpeg для этого.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930322
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gif

максимальный уровень воды 13, остаточный 0.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930325
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Асимптоматику я могу глазами увидеть и в VisualBasic и в Assembler.
Мне только нужно 3-4 точки измерений алгоритма с разным объемом N и отклики по времени.
Тоесть наличие или отсуствие в стеке Java никак не влияет на форму этого графика.

Здесь конечно Шарахову удобнее. У него - статически компилируемый язык.
Но топик ведь посвящен алгоритмизации. Поэтому хороший алгоритм на Java
может быть быстрее чем плохой на Delphi.


Это вряд ли.
Плохой алгоритм на Delphi завсегда быстрее ))
...
Рейтинг: 0 / 0
Задачка про остров
    #39930330
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя картинка
mypict
...
Рейтинг: 0 / 0
Задачка про остров
    #39930334
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный вариант для проверок может из этой картинки получиться
...
Рейтинг: 0 / 0
Задачка про остров
    #39930348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Асимптоматику я могу глазами увидеть и в VisualBasic и в Assembler.
Мне только нужно 3-4 точки измерений алгоритма с разным объемом N и отклики по времени.
Тоесть наличие или отсуствие в стеке Java никак не влияет на форму этого графика.

Здесь конечно Шарахову удобнее. У него - статически компилируемый язык.
Но топик ведь посвящен алгоритмизации. Поэтому хороший алгоритм на Java
может быть быстрее чем плохой на Delphi.


Это вряд ли.
Плохой алгоритм на Delphi завсегда быстрее ))

Хвастун.
...
Рейтинг: 0 / 0
Задачка про остров
    #39930413
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Aleksandr Sharahov
пропущено...

Это вряд ли.
Плохой алгоритм на Delphi завсегда быстрее ))

Хвастун.


Да не, ты опять не въехал: это я так твою активность стимулирую ))
...
Рейтинг: 0 / 0
Задачка про остров
    #39930438
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
пропущено...

Хвастун.


Да не, ты опять не въехал: это я так твою активность стимулирую ))

Уж спасибо. Я как нибудь сам себя простимулирую. Пока я погряз
в изучение Rust - предлагаю развивать идею параллелизма.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931246
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Моя картинка ... mypict
Забавно, ужели вот так диффузно вода порсачивается сквозь точечное облако?

Как понимаю вы все у финиша. Вопрос у меня теперь. Я слышал, выговорили про срезы. Основа алгоритма какая? Делать попикселные срезы, в каждом искать замкнутые контуры, затем просуммировать внутренности контуров, границы не считать, так?
Без никаких деревьев или графов, да?
...
Рейтинг: 0 / 0
Задачка про остров
    #39931251
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока я погряз в изучение Rust - предлагаю развивать идею параллелизма планеризма....то не Чкалов,
это - Руст(цэ)
...
Рейтинг: 0 / 0
Задачка про остров
    #39931274
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увы мне увы. Хотел успеть везде.

Из хороших новостей. Тестовый сет я полностью подготовил. Куда его запаблишить? Github? Amazon?
...
Рейтинг: 0 / 0
Задачка про остров
    #39931279
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя хотел бы доставать это из облака-мыл-ру-публик.
Как выше iOracleDev в Моя картинка ... mypict
...
Рейтинг: 0 / 0
Задачка про остров
    #39931288
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
iOracleDev
Моя картинка ... mypict
Забавно, ужели вот так диффузно вода порсачивается сквозь точечное облако?

Как понимаю вы все у финиша. Вопрос у меня теперь. Я слышал, выговорили про срезы. Основа алгоритма какая? Делать попикселные срезы, в каждом искать замкнутые контуры, затем просуммировать внутренности контуров, границы не считать, так?
Без никаких деревьев или графов, да?


Финиш пройден, проверил 3 варианта (графы идут лесом):

1) Нарезаем слоями по высоте и заполняем водой каждый слой по отдельности.
Отладил не сразу из-за проблемы слияния ручейков. Работает, но медленно.
Плюс в том, что результаты можно использовать для отладки.

2) Ставим по периметру бесконечной высоты стены, заливаем все это водой под завязку, а потом срезаем лишнюю воду,
проходя по высотам снизу вверх. Простейшая рекурсия. Работает быстрее т.к. каждая ячейка считается 1 раз.

3) Тот же вариант без рекурсии. Чуть быстрее.

Скорость всех вариантов заметно зависит от организации данных.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931343
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конвертировал PNG/jpg картинки с ландшафтами в полу-текстовый pgm с помошью Линуксового convert.

Хм... странно получается только заголовок текстовый. А туловище битмапы не-текстовый (не принтабельный вид).
Оно вроде-бы не страшно но я хотел сохранить эту текстовую природу. Это поможет в топике легче
разбирать различные ситуации.

Пришлось потратить еще час времени чтоб написать на java пару утилит для PPM(цветные) PGM(черно белые) конвертеры
с чисто текстовым представлением.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931361
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Забавно, ужели вот так диффузно вода порсачивается сквозь точечное облако?

Как понимаю вы все у финиша. Вопрос у меня теперь. Я слышал, выговорили про срезы. Основа алгоритма какая? Делать попикселные срезы, в каждом искать замкнутые контуры, затем просуммировать внутренности контуров, границы не считать, так?
Без никаких деревьев или графов, да?

Мой вариант простой, иду сверху срезая высоты, например пусть будет полное затопление и максимальная высота острова 255, тогда первый срез будет на высоте 255, при этом плитки на том же уровне считаются для среза сухими.

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

Отработал уровень, в итоге для 255 уровня получаю плитки с временным статусом и плитки которые статус не получили, далее прохожу по всем плиткам и снимаю временный статус, если временный статус не был установлен ставлю постоянный статус, если плитка имеет ту же высоту что и обрабатываемый срез (255), то она получает постоянный статус "сухая", если плитка имеет меньшую высоту и не имела временный статус она получает постоянный статус "под водой". Таким образом все плитки того же уровня получили статус "сухая", плитки имеющие уровень ниже и оказавшиеся в замкнутых контурах получили статус "под водой".

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

Если наводнение не полное и не покрывает остров целиком, то для самого верхнего уровня все плитки не получившие временный статус получают постоянный статус "сухая", даже если их уровень ниже уровня наводнения, поскольку вода не имела к ним доступа.

Картинки подъема воды делал просто считая последовательно по одному срезу, задавая уровень подъема воды и уровень океана после отлива одинаковым.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931362
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
1) Нарезаем слоями по высоте и заполняем водой каждый слой по отдельности.
Отладил не сразу из-за проблемы слияния ручейков. Работает, но медленно.
Плюс в том, что результаты можно использовать для отладки.

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

Мой вариант здесь: 22077648
Пока не заводил, нет времени.

Там никаких срезов, сплошной поиск в ширину, правда, для обработки озёр хочу вместо оного сделать построчный floodfill, это даст ускорение на кейсах с большими лужами, особенно в виде лабиринтов. В общем, говнокодить придётся много )
...
Рейтинг: 0 / 0
Задачка про остров
    #39931429
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
1) Нарезаем слоями по высоте и заполняем водой каждый слой по отдельности.
Отладил не сразу из-за проблемы слияния ручейков. Работает, но медленно.
Плюс в том, что результаты можно использовать для отладки.

Откуда ты там ручейки взял?


начни реализовывать floodfill, сразу поймешь )
...
Рейтинг: 0 / 0
Задачка про остров
    #39931515
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш. А твои сорцы где-то опубликованы в последней версии?
...
Рейтинг: 0 / 0
Задачка про остров
    #39931527
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Саш. А твои сорцы где-то опубликованы в последней версии?


Сорцы 22081712 .
Пример карты и результат 22081766 .
Там же чуть ниже еще, если надо, процедура генерации случайной карты и датчик случайных чисел.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931635
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Саш. А твои сорцы где-то опубликованы в последней версии?


Сорцы 22081712 .
Пример карты и результат 22081766 .
Там же чуть ниже еще, если надо, процедура генерации случайной карты и датчик случайных чисел.

Я смогу воспроизвести его под Linux Free Pascal (fpc) правда с твоей помошью и если аккуратно
выкосить создание формочек.

Потом я сделаю некий сравнительный тест твоего сорца и iOracleDev-s.

И еще особо меня интересовали эвристики основанные на предварительном анализе карты.
Например шум и пики - один подход. Множество горизонтальных плато - другой.
...
Рейтинг: 0 / 0
Задачка про остров
    #39931801
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
начни реализовывать floodfill, сразу поймешь )

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

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

Мы упростили для визуализации, хотя если у вас на мониторе и в графических файлах пиксели шестиугольные, то мы идем к вам))
...
Рейтинг: 0 / 0
Задачка про остров
    #39932441
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем. Не стенки. А спиральная дорога вокруг горы.

Я искал формулу вида z = f(x,y)
...
Рейтинг: 0 / 0
Задачка про остров
    #39932442
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
exp98
И ... забыл спросить, у вас пикселы 6-угольные в сечении?

Мы упростили для визуализации, хотя если у вас на мониторе и в графических файлах пиксели шестиугольные, то мы идем к вам))

Топик стартовал как решение графовых задач с 6й степенью вершин.

Но для визуализации что 4 что 6 степени одинаковы.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932496
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спсб за пояснения.
Искал способ примазаться к чужой славе, но здесь всё схвачено)
mayton
формулу вида z = f(x,y)
Теоретически можно, возиться долго лень. Это же типа отображения полоски в 3Д или как кожура, с мандарина аккуратной полоской срезанная.
Предлагаю брутальный способ закраски (даже танцуя не от пикселов к цвету, а лучами как получится, с перекрытиями). Спираль - это точки радиуса, а будет полуоткрытый ]отрезок], не идеальный асфальт на дороге, конечно, с камешками. Раз уж ввязался.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932501
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
параметрически ? Как f(R,phi)
...
Рейтинг: 0 / 0
Задачка про остров
    #39932502
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Rust. Я был неправ. Завяз в мелочах. Задача чуть более широкая а мелкие технические вопросы постоянно
меня блокируют. Я попробую реализовать на Java. А потом уже с экспериментами.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932523
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Саш. А твои сорцы где-то опубликованы в последней версии?


Сорцы 22081712 .
Пример карты и результат 22081766 .
Там же чуть ниже еще, если надо, процедура генерации случайной карты и датчик случайных чисел.

Не удалось мне собрать на FPC под Linux твой исходник. Надо что-то добавить.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#!/bin/bash
fpc -Mdelphi -CX -O3 -XX -vewnhi -Fi. -Fu. -FU. islands.lpr

Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Free Pascal Compiler version 3.0.4+dfsg-18ubuntu2 [2018/08/29] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling islands.lpr
islands.lpr(96) Fatal: Syntax error, "BEGIN" expected but "end of file" found
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode


Я не знаток и не могу за 10 минут пофиксить языковые недочеты. Больше тратить время не хочется.
Демотивирует. 96 строка - это конец исходника.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932526
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
просто вызывалку нужно добавить в конец
Что-то вроде
Код: pascal
1.
2.
3.
4.
5.
BEGIN
   writeln('function returns: ',FillWater());
   readln;
END.
  

.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932527
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже лучше. Бинарник собрался.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Free Pascal Compiler version 3.0.4+dfsg-18ubuntu2 [2018/08/29] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling islands.lpr
Linking islands
/usr/bin/ld.bfd: warning: link.res contains output sections; did you forget -T?
100 lines compiled, 0.1 sec
2 hint(s) issued



Работает секунд 10 потом выдает число

Код: pascal
1.
2.
~/git/probe/islands/sharahov$ ./islands
function returns: 3288343446



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

https://people.sc.fsu.edu/~jburkardt/data/pgma/pgma.html

Без этого мы не сможем сравнивать алгоритмы.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932559
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Кто захочет поразвлекаться, исходные данные в массиве, списком и графом
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
public class Hexagon {

    public static final int NUMBER_OF_SIDES = 6;
    private int height;
    private String status;

    // индексы ребер
    //   1 /\ 2
    //  0 |  | 3
    //   5 \/ 4
    private Hexagon[] hexagonSides = new Hexagon[NUMBER_OF_SIDES];

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setHexagonSides(Hexagon[] hexagonSides) {
        this.hexagonSides = hexagonSides;
    }

    public Hexagon getHexagonSide(int side) {
        return hexagonSides[side];
    }

    public void setHexagonSide(int side, Hexagon hexagon) {
        this.hexagonSides[side] = hexagon;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public Hexagon(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        //   1 /\ 2
        //  0 |  | 3
        //   5 \/ 4

        //         / \ / \ / \                    / \ / \ / \
        //        | 0 | 1 | 2 |                  | 1 | 4 | 3 |
        //       / \ / \ / \ / \                / \ / \ / \ / \
        //      | 3 | 4 | 5 | 6 |              | 1 | 5 | 1 | 5 |
        //     / \ / \ / \ / \ / \            / \ / \ / \ / \ / \
        //    | 7 | 8 | 9 | 10| 11|          | 2 | 3 | 2 | 4 | 6 |
        //     \ / \ / \ / \ / \ /            \ / \ / \ / \ / \ /
        //      | 12| 13| 14| 15|              | 2 | 6 | 4 | 2 |
        //       \ / \ / \ / \ /                \ / \ / \ / \ /
        //        | 16| 17| 18|                  | 3 | 1 | 2 |
        //         \ / \ / \ /                    \ / \ / \ /

        int[][] array = new int[][] {
                {0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 1, 4, 3, 0},
                {0, 0, 1, 5, 1, 5, 0},
                {0, 2, 3, 2, 4, 6, 0},
                {0, 2, 6, 4, 2, 0, 0},
                {0, 3, 1, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0}
        };

        // массив шестиугольников
        Hexagon[][] arrayHexagons = new Hexagon[array.length][array[0].length];
        // список шестиугольников
        ArrayList <Hexagon> listOfHexagons = new ArrayList<>(20);

        // заполняем массив и список, ссылки в массиве и списке на одни и те же шестиугольники
        for (int i = 0; i < array.length; i++ ) {
            for (int k = 0; k < array[i].length; k++) {
                if (array[i][k] > 0) {
                    arrayHexagons[i][k] = new Hexagon(array[i][k]);
                    listOfHexagons.add(arrayHexagons[i][k]);
                } else {
                    arrayHexagons[i][k] = null;
                }
            }
        }

        // записываем связи шестиугольников друг с другом
        for (int i = 1; i < array.length - 1; i++ ) {
            for (int k = 1; k < array[i].length - 1; k++) {
                if (array[i][k] > 0) {
                    arrayHexagons[i][k].setHexagonSides(new Hexagon[] {
                                    arrayHexagons[i][k-1], arrayHexagons[i-1][k], arrayHexagons[i-1][k+1],
                                    arrayHexagons[i][k+1], arrayHexagons[i+1][k], arrayHexagons[i+1][k-1] });
                }
            }
        }

        System.out.println(listOfHexagons);
        System.out.println("====================================");
        for (Hexagon[] h1: arrayHexagons) {
            for (Hexagon h2: h1) {
                if (h2 != null) {
                    System.out.print(h2 + " - ");
                    for (int i = 0; i < Hexagon.NUMBER_OF_SIDES; i++) {
                        System.out.print(h2.getHexagonSide(i) + ((i+1 < Hexagon.NUMBER_OF_SIDES) ? ", " : ""));
                    }
                    System.out.println();
                }
            }
        }
    }
}


iOracleDev.

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

Нет, вот исходник:
iOracleDev
Мой вариант, он конечно не оптимален в плане реализации, зато квадратно-гнездовой и по нему можно проверять более оптимальные варианты.
Площадка:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
public class Node {

    public final int NUMBER_OF_NEIGHBOURS;
    private int height;
    private char status;

    private Node[] neighbours;

    public Node(int height) {
        this(height, 4);
    }

    public Node(int height, int NUMBER_OF_NEIGHBOURS) {
        this.NUMBER_OF_NEIGHBOURS = NUMBER_OF_NEIGHBOURS;
        this.height = height;
        this.neighbours = new Node[this.NUMBER_OF_NEIGHBOURS];
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setNeighbours(Node[] neighbours) {
        this.neighbours = neighbours;
    }

    public Node getNeighbour(int neighbour) {
        return neighbours[neighbour];
    }

    public void setNeighbour(int neighbour, Node node) {
        this.neighbours[neighbour] = node;
    }

    public char getStatus() {
        return status;
    }

    public void setStatus(char status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return Integer.toString(this.height);
    }
}



Превращение картинки в массив и обратно
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class GrayRgbBmpArray {

    public final int mask = 0b00000000_00000000_00000000_11111111;
    public int[][] imageInByte;
    public int[][] outputArray;
    private String fullInputFileName;
    private String fullOutputFileName;
    private BufferedImage originalImage;

    public GrayRgbBmpArray(String fullInputFileName, String fullOutputFileName) {
        this.fullInputFileName = fullInputFileName;
        this.fullOutputFileName = fullOutputFileName;
    }

    static BufferedImage deepCopy(BufferedImage bi) {
        ColorModel cm = bi.getColorModel();
        boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
        WritableRaster raster = bi.copyData(null);
        //System.out.println(cm.toString() + " " + raster.toString());
        return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
    }

    public void readToArray() {
        try {
            originalImage = ImageIO.read(new File(fullInputFileName));
            imageInByte = new int[originalImage.getHeight()][originalImage.getWidth()];
            outputArray = new int[originalImage.getHeight()][originalImage.getWidth()];
            int input, blue_channel, invert;
            for (int i = 0; i< originalImage.getHeight(); i++) {
                for (int k = 0; k < originalImage.getWidth(); k++) {
                    input = originalImage.getRGB(k, i);
                    //System.out.println(Integer.toBinaryString(input));
                    blue_channel =  input & mask;
                    invert = blue_channel ^ mask;
                    //System.out.println(invert);
                    imageInByte[i][k] = invert;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void writeToFile(int underWaterColorX, int  underWaterColorY) {
        if (outputArray == null || outputArray.length == 0 || outputArray[0].length == 0) {
            System.out.println("Нет данных для вывода в файл");
            return;
        }

        int height = outputArray.length;
        int width = outputArray[0].length;
        int blue_channel;
        // координаты пикселя исходного изображения с которого берется цвет для закраски затопленных плиток
        int underWaterColor = originalImage.getRGB(underWaterColorX, underWaterColorY);
        // результирующую картинку создаем как копию исходной
        BufferedImage image = deepCopy(originalImage);

        for (int i = 0; i < height; i++) {
            for (int k = 0; k < width; k++) {
                if (outputArray[i][k] == -1) {
                    // для затопленных плиток высота установлена в -1
                    image.setRGB(k,i, underWaterColor);
                } else {
                    blue_channel = outputArray[i][k]^mask;
                    image.setRGB(k,i, 0b11111111_00000000_00000000_00000000
                            | blue_channel << 16 | blue_channel << 8 | blue_channel);
                }
            }
        }

        try {
            ImageIO.write(image, "bmp", new FileOutputStream(fullOutputFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



Сам расчет, на входе массив, на выходе тоже массив
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
    public static int[][] Calculate(int[][] inputArray, int oceanLevel, int maxLevel) {
        // oceanLevel - уровень океана, ячейки граничащие с океаном на этом уровне сухие
        // maxLevel - максимальный уровень подъема воды
        if (inputArray == null || oceanLevel < 0 || maxLevel < oceanLevel) {
            System.out.println("Неконсистентные параметры");
            return null;
        }

        // массив четырехсвязных узлов (плиток)
        int height = inputArray.length;  // строки
        int width = inputArray[0].length; // столбцы
        Node[][] nodes = new Node[height][width];

        int underWater = oceanLevel - 1;
        int maxIslandLevel = 0;

        // заполняем массив узлами
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                nodes[i][k] = new Node(inputArray[i][k]);
                nodes[i][k].setStatus('n');  // статус еще не определялся
                // определяем максимальную высоту (уровень) острова
                if (inputArray[i][k] > maxIslandLevel) {
                    maxIslandLevel = inputArray[i][k];
                }
            }
        }

        // если заданный уровень океана выше уровня острова, нет смысла считать пустые слои
        int startLevel;
        if (maxIslandLevel < maxLevel) {
            startLevel = maxIslandLevel;
        } else {
            startLevel = maxLevel;
        }

        // записываем связи узлов
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                nodes[i][k].setNeighbours(new Node[] {  (k > 0) ? nodes[i][k-1] : null,
                                                        (i > 0) ? nodes[i-1][k] : null,
                                                        (k+1 < width) ? nodes[i][k+1] : null,
                                                        (i+1 < height) ? nodes[i+1][k] : null } );
            }
        }

        char st;  // переменная для кеширования статуса
        Node tmpNode; // переменная для кеширования узла
        Node nextNode; // в эту переменную сохраняем следующий узел при обходе периметра
        Node neighbourNode; // переменная для перебора соседей

        Queue<Node> queue = new LinkedList<>();
        for (int currentLevel = startLevel; currentLevel > underWater ; currentLevel--) {
            // на каждом уровне для каждой плитки ниже текущего уровня от периметра проводим поиск в ширину,
            // если она ниже текущего уровня и не имеет установленных постоянных статусов, то ставим временный
            // статус w - под водой, плитки раные текущему уровню или превышающие его не переходим
            // они являются барьером на текущем уровне
            queue.clear(); // очередь для поиска в ширину

            // обходим периметр и помещаем его в очередь на поиск в ширину
            tmpNode = nodes[0][0];
            int direction = 2; // начинаем идти вправо из нулевого узла
            while (tmpNode != null) {
                st = tmpNode.getStatus();
                if (st != 'D' && st != 'W' && tmpNode.getHeight() < currentLevel) {
                    tmpNode.setStatus('w');
                    queue.add(tmpNode);
                }

                nextNode = tmpNode.getNeighbour(direction);
                // если дошли до конца измерения, меняем направление на следующее
                if (nextNode == null) {
                    if (direction == 2) {
                        direction = 3;
                    }
                    else if (direction == 3)
                    {
                        direction = 0;
                    }
                    else if (direction == 0)
                    {
                        direction = 1;
                    } else {
                        break;
                    }
                    nextNode = tmpNode.getNeighbour(direction);
                }
                tmpNode = nextNode;
            }

            int processedNodes = queue.size();
            // выполняем для очереди поиск в ширину добавляя следующие узлы для обхода в очередь
            while (!queue.isEmpty()) {
                tmpNode = queue.poll();
                for (int j = 0; j < tmpNode.NUMBER_OF_NEIGHBOURS; j++) {
                    neighbourNode = tmpNode.getNeighbour(j);
                    if (neighbourNode == null) {
                        continue;
                    }

                    st = neighbourNode.getStatus();
                    if (st == 'w' || st == 'D' || st == 'W' || neighbourNode.getHeight() >= currentLevel) {
                        continue;
                    }
                    neighbourNode.setStatus('w');
                    queue.add(neighbourNode);
                    processedNodes++;
                }
            }

            System.out.println("Level = " + currentLevel + ",  processedNodes = " + processedNodes);

            // все плитки не имеющие постоянного статуса D (dry) или W (wet) и не имеющие временного
            // статуса w получают постоянный статус, статус w сбрасывается в u - unknown
            for (int i = 0; i < height; i++ ) {
                for (int k = 0; k < width; k++) {
                    tmpNode = nodes[i][k];
                    st = tmpNode.getStatus();
                    if (st == 'D' || st == 'W') {
                        continue;
                    }

                    if (tmpNode.getHeight() == currentLevel) {
                        tmpNode.setStatus('D');
                    } else if (st == 'w') {
                        tmpNode.setStatus('u');
                    } else if (currentLevel == maxLevel) {
                        tmpNode.setStatus('D');
                    } else {
                        tmpNode.setStatus('W');
                    }
                }
            }
        }

        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                // плитки не получившие постоянный статус и находящиеся ниже уровня океана
                tmpNode = nodes[i][k];
                st = tmpNode.getStatus();
                if (st != 'D' && st != 'W') {
                    tmpNode.setStatus('W');
                }
            }
        }

        // формируем результирующий массив
        int[][] outputArray = new int[height][width];
        for (int i = 0; i < height; i++ ) {
            for (int k = 0; k < width; k++) {
                tmpNode = nodes[i][k];
                if (tmpNode.getStatus() == 'W') {
                    outputArray[i][k] = -1;
                } else {
                    outputArray[i][k] = tmpNode.getHeight();
                }
            }
        }

        return outputArray;
    }
}



Использование:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        // на входе нужен файл с 8-битной глубиной цвета и использованием 256 градаций серого, если хочется чтобы 
        // затопленные плитки имели цвет отличный от градаций серого, можно добавить цветной пиксель
        GrayRgbBmpArray grba = new GrayRgbBmpArray("C:\\temp\\test.bmp", "C:\\temp\\output.bmp");
        // считываем исходную картинку в массив
        grba.readToArray();
        // расчет, остаточный уровень океана может быть от 0 до 255, максимальный уровень подъема при наводнении от 0 до инта
        // если нужно затопить весь отсров уровень должен быть больше 255
        // можно устанавливать равные, тогда получим вид острова затопленного до определенной высоты
        // если собрать последовательно сверху такие срезы, то можно сделать гифку отлива))
        grba.outputArray = Island.Calculate(grba.imageInByte, 1, 260);
        // выводим результат в файл, цвет для затопленных плиток берется от пикселя исходной картинки с координатами (0,0)
        // можно указать любую другую координату для цветного пикселя в исходном файле
        grba.writeToFile(0, 0);


...
Рейтинг: 0 / 0
Задачка про остров
    #39932582
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
параметрически ? Как f(R,phi)
Ну в общем да, в полярных с центром в центре матрицы и персчёты к-т туда-сюда .... и закраска кусочно-постоянными лучами.
Написал сюда словесный алгоритм, но .... браузер, козёл розово-голубой((
Короче, нахрапом не успел, правки,правки ... надо строго по бумажке. А завтра времни почти не останется. Если никто не спешит, надеюсь ко вторнику, во всяк черновую картинку для замечаний.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932584
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
mayton
параметрически ? Как f(R,phi)
Ну в общем да, в полярных с центром в центре матрицы и персчёты к-т туда-сюда .... и закраска кусочно-постоянными лучами.
Написал сюда словесный алгоритм, но .... браузер, козёл розово-голубой((
Короче, нахрапом не успел, правки,правки ... надо строго по бумажке. А завтра времни почти не останется. Если никто не спешит, надеюсь ко вторнику, во всяк черновую картинку для замечаний.

Не спеши. Синтетические ландшафты у меня еще не готовы. Время есть.
Спираль надо сделать качественно чтоб между витками не было рандомных
пиков или шума. Или ступенек квантизации там где должен быть градиент.

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

Нет, вот исходник:



Вместе с двумя файлами Node, GrayRgbBmpArray вы приложили два фрагмента кода которые непонятно
к чему относятся. Что мне с ними делать? Это недооформленные части проекта. И вы ставите меня в сложное
положение. Очевидно я должен сам придумать куда или положить. С одной стороны это - пустяк. С другой
стороны вы как-будто самоустранились от этой разработки и считаете что кто-то ее закончит.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932730
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Один непонятный фрагмент, это сам расчет и он вполне себе изолирован и даже с комментами, второй это то как их все вместе использовать, тоже с комментами, если есть более конкретные вопросы могу расписать заложенную мысль. Я не решал задачу создать продуктовое решение, мне интересно было опробовать работу алгоритма, я ее опробовал, для тех кто захочет разобраться выложил и снабдил комментариями, не хочешь разбираться не разбирайся, хочешь продуктовое решение можешь сделать, мне не надо, я своей цели в данном вопросе достиг.


PS: расчет поместить в статический класс Island, а следующий кусок в main
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        // на входе нужен файл с 8-битной глубиной цвета и использованием 256 градаций серого, если хочется чтобы 
        // затопленные плитки имели цвет отличный от градаций серого, можно добавить цветной пиксель
        GrayRgbBmpArray grba = new GrayRgbBmpArray("C:\\temp\\test.bmp", "C:\\temp\\output.bmp");
        // считываем исходную картинку в массив
        grba.readToArray();
        // расчет, остаточный уровень океана может быть от 0 до 255, максимальный уровень подъема при наводнении от 0 до инта
        // если нужно затопить весь отсров уровень должен быть больше 255
        // можно устанавливать равные, тогда получим вид острова затопленного до определенной высоты
        // если собрать последовательно сверху такие срезы, то можно сделать гифку отлива))
        grba.outputArray = Island.Calculate(grba.imageInByte, 1, 260);
        // выводим результат в файл, цвет для затопленных плиток берется от пикселя исходной картинки с координатами (0,0)
        // можно указать любую другую координату для цветного пикселя в исходном файле
        grba.writeToFile(0, 0);
...
Рейтинг: 0 / 0
Задачка про остров
    #39932783
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно было-бы хоть создать maven-based проект и довести его до стадии компилляции.

Впрочем я не настаиваю. Как будет угодно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932825
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого нужны морфологические процедуры. А я делаю простой математикой умножить-разделить.
mayton
Спираль надо сделать качественно чтоб между витками не было рандомных пиков или шума. Или ступенек квантизации там где должен быть градиент.
Боюсь, для 2К в лучшем случае считать будет всю ночь, если вообще памяти хватит. Мне кажется допустим небольшой % ямок.

Показываю сегодняшнее хреновое состояние. Реальный азмер 200х200, а это зум. И наврное надо градиент наоборот, иначе это будет яма.
Есть сейчас фигня - криволинейный конус и его окрестности - это явная ошибка. Сначала хотел спросить идей насчёт его, теперь предполагаю, что это ошибка при делении на R~0.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932826
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ... просто шикарный остров. Вавилонская башня еще и острые пики.



По сабжу - понятия не имею как такой эффект может произойти.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932829
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дай мне формулу твоей спирали. Похоже это архимедова. Коэффициенты и прочее.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932960
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и есть. А дорожка - это уже эклектика нахрапная, голимая.
Обычная формула спирали, запись только в векторном виде:
Код: plaintext
1.
2.
3.
4.
5.
k= 5; n= 200; dk= 10;     n - это размерность матрицы,
     т.е. в спирали (k*60*dk) точек, 5 витков, 1/10 - дополнительное дробление шага радиан
ag= [0 : 1/60/dk : k]; fig=2*pi*ag;     где Pi== ПИ,  fig - угол Фи
R= n/k*ag;        это радиус
xf= R * cos(fig); 
yf= R * sin(fig);

Спираль на рисунке я по центру дорожки поместил и подсветил, чтоб видеть её.
В матрице потом её центрирую. Потом ещё матрицу перевернуть надо, чтобы оси направить как у людей, а не как у прогеров.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98, ок спасибо. Вечером попробую сделать. Для начала хоть начертить ее корректно.
Заполнять думаю надо трапециями. Ступеньками башни по сути.
...
Рейтинг: 0 / 0
Задачка про остров
    #39932981
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я вообще брутально щас считаю. Для каждой непустой точки матрицы (т.е. не на спирали) вычисляю, к какому углу (из дискретных fig() ) она ближе, затем -- ближе к какой именно точке на найденном луче.
Так получается, что сами витки посередь дорожки. А думал всё время, что притягиваю дорожку к краю бордюра (башка думала одно, руки делали другое). Это тоже надо будет фиксить. Затем ещё углы матрицы тоже не трогать.
Собсно и весь алгоритм. Трапеции замучаешься считать.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933072
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трапеция - это просто 4 точки по твоему алгоритму. Не?

Хотя да. Закраска трапеции это нудоство еще то. Надо поискать коробочные алгоритмы.

А там я еще закраску Гуро хотел свою. Для треугольников.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933153
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и я о том же. И я вначале так же думал. Но суровая дискретность матрицы ...
Подводный камень в том, что R у меня хоть и растет линейно углу, но при завёртывании, чем дальше, тем чаще дыры. Поэтому дополнительное дробление в виде множителя dk не лишнее. С ростом dk дыр на периферии станет меньше, а в центральной области будет сильная избыточность точек R.

Ещё камень в том, что при dk= 6*t получим шаг=t*360 град. Очеь заманчиво для формирования лучей. Но снова вмешивается суровая дискретность, и там выходит точность плюс-минус.

Пока решил додавливать подход как есть.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933196
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, главный косяк ликвидировал, получилось такое зрелище (со сдвигом пока и не перевёрнутое). Ошибка была не там ,где предполагал - забыл центрировать в одном месте.

n=400 dk=18 готовилось 5 минут

Вопрос теперь: продолжать дальше или уже не нужно?
И кстати, ступеньки там сами по себе присутствуют, их видно при большом зуме.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933208
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще шикарно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933219
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь смотри. Я тут ещё оставил не крашенными углы квадрата. Но для простоты сделал это ВНЕ ОКРУЖНОСТИ, к-рая описана вокруг спирали. Иначе надо на каждом луче сравнивать и т.д. или другие хитрости.
Центр спирали немного динамичен в зависиомти от размерности. Неожиданно оказалось, что самый большой радиус от центра - вертик вверх, а не гориз вправо, как мне хотелось верить.
Придётся разбираться. То ли смещение при преобразовании коорд-т, то ли не знаю что.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933239
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам вариант центрированный со спиралью, вписанный в окружность, + бордюр вокруг рисунка 400х400.
n=400 dk=12
Пока могу выдохнуть.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933241
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо бы ещё ширину дорожки сделать поменьше.

Чтоб вода затекла не так быстро.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933326
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как понять Уже? могу больше витков задать, они и станут уже.
Кстати заочно понял, в матрице масштаб разный по вертикали и горизонтали. Можно поправить, можно нет, картинка слегка видоизменится, особенно в части "описанной" окружности.
Это ещё один довод к тому, что нельзя прогать навалом - лишние проблемы потом вычищать. И функции/методы для преобразования координат - тогда не забудется центровка. Вот только набитая техника выполнения здесь и выручала.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933370
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. 1-я картинка была более правильной. Вавилонская башня. Правильная такая.



То вторая картинка это скорее - Ад - Сандро Ботичелли Либо башня построенная в яме. Смотря как мапить
цвета на высоты.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933414
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь о 2-х последних?
Задуман был как раз 2-й вариант, 1-й случился по ошибке. Если в 1-м тоже не красить углы будет тот же Ботичелли. И вообще, оба - Вавилонская яма.
Может такой адок нужен?
...
Рейтинг: 0 / 0
Задачка про остров
    #39933418
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...или такой?
...
Рейтинг: 0 / 0
Задачка про остров
    #39933422
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём во 2-м всё по ТЗ: дорожка внутри спирали, забор по краям.
В 1-м спираль-забор как разделительная линия, при этом с одно краю дороги пропасть, с другого стена.

Вы начальник, вам виднее(цэ)
Готовьте ТЗ.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933429
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Базовое ТЗ было в 1 посту.

Я предложил - уйти от хексагональной сетки и подойти к квадратной.
Расширить объем исходных данных. По сути процессить растровые картинки высот.
Изучить возможности параллелизма.
Сделать дополнительное условие. Океан затапливает остров на высоту X а потом оступает на высоту Y.
Я также предложил ввести тестовый сет данных.
Я почему-то предполагаю что среди алгоритмов не будет абсолютных
победителей а будут локальные победы на определенных типах карт.
Например имеющие плато. Александр кажется тоже писал об этом.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933499
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э, нет, то другое ТЗ, вопрос был лишь про Вавилонскую башню (в расширенной трактовке и про дыру). Ничего более я и не задумывал, речь шла об изготовлении картинки. И вопрос прежний, годится в таком духе, что и как изменить/подправить? Нет - так нет, я прекращу.
Кол-во образцов (да даже 2 только) немало, чтобы выдвинуть продуманные требования.

Эти образцы, имхо, следует подправить:
а) масштабирование сделать одинаковое по Х и У;
б) наконец уже, перевернуть матрицы, чтобы спираль крутилась из центра против солнца в нашем полушарии.

Да, и плато здесь не предусматривалось, они кое-где имеются в виде ступенек благодаря тому, что спираль в матрице не гладкая, а ступенчатая. Если дискредитировать палитру грубее, то ступеньки станут длиннее и выше.

Здесь и ниже утренние варианты с исправленным п. (а)
...
Рейтинг: 0 / 0
Задачка про остров
    #39933506
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спирарь по краю (и оба, забыл сказать, возрастают из центра)
...
Рейтинг: 0 / 0
Задачка про остров
    #39933512
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, при правке исчезает вложение.
возрастающая спираль как срединная разметка.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933524
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Базовое ТЗ было в 1 посту.
Я предложил - уйти от хексагональной сетки и подойти к квадратной.

Зачем уходить? Чтобы понизить связность, рассматривая только 4х соседей?
Так в этом и состоит одна из проблем, которую требуется преодолеть решающему эту задачу.
Тогда уж давайте рассматривать 8 соседей на квадратной сетке.
А еще лучше решить задачу и для квадратов с 8 соседями, и для хексов с 6 соседями (мы программисты или где).


mayton
Расширить объем исходных данных. По сути процессить растровые картинки высот.
Изучить возможности параллелизма.

Это как бы боковая ветка. Не особенно интересная.


mayton
Сделать дополнительное условие. Океан затапливает остров на высоту X а потом оступает на высоту Y.

На сколько оступает - не интересно, это не усложняет задачу.
Давайте считать, что вода всегда приходит из минус бесконечности и уходит в минус бесконечность.
Таким образом, для каждой карты давайте решать 256 задач, с уровями прилива 0..255.


mayton
Я также предложил ввести тестовый сет данных.
Я почему-то предполагаю что среди алгоритмов не будет абсолютных
победителей а будут локальные победы на определенных типах карт.
Например имеющие плато. Александр кажется тоже писал об этом.

Уточнение - давайте для единообразия карты в градациях серого формате 24-бит *.bmp
...
Рейтинг: 0 / 0
Задачка про остров
    #39933527
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, кстати, интересная карта
...
Рейтинг: 0 / 0
Задачка про остров
    #39933537
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
mayton
Базовое ТЗ было в 1 посту.
Я предложил - уйти от хексагональной сетки и подойти к квадратной.

Зачем уходить? Чтобы понизить связность, рассматривая только 4х соседей?
Так в этом и состоит одна из проблем, которую требуется преодолеть решающему эту задачу.
Тогда уж давайте рассматривать 8 соседей на квадратной сетке.
А еще лучше решить задачу и для квадратов с 8 соседями, и для хексов с 6 соседями (мы программисты или где).

Я собственно первый и предложил генерализировать алгоритм через графы.
Просто мне хотелось иметь быстрый старт для всех участников. Поэтому я и предложил не 6-связную
ячейку а 4-связную.

А параллелизм на графах - это ожидаемая мной вишенка на торте.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933540
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov

mayton
Сделать дополнительное условие. Океан затапливает остров на высоту X а потом оступает на высоту Y.

На сколько оступает - не интересно, это не усложняет задачу.
Давайте считать, что вода всегда приходит из минус бесконечности и уходит в минус бесконечность.
Таким образом, для каждой карты давайте решать 256 задач, с уровями прилива 0..255.

Хорошо. Принято. Пускай будет 256 приливов океана с постепенным повышением максимума до 255.

Но я также заметил что многие учебные образцы карт не нормированы от 0 до 256. Поэтому некоторые
итерации для них будут вырожденные. Искусственно нормировать их не хотелось-бы. Тк. это вносит
эффект квантизации. Появляются искусственные пики на гистограмме частот которых изначально не было.

Тоесть надо решить что например делать с островом который изначально был задан высотами например от 100 до 150 ?
...
Рейтинг: 0 / 0
Задачка про остров
    #39933541
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
делать то же, что и со всеми другими - решать все 256 задач, пускай некоторые решения совпадут.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933545
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov

Уточнение - давайте для единообразия карты в градациях серого формате 24-бит *.bmp

Я вообще не против любого графического формата. Можно и BMP.
PGM я предлагал опираясь на опыт других хакатонов. Чем проще и демократичнее формат
графики - тем быстрее будет вхождение разработчика. PGM - текстовый и ни у кого не должно быть
проблем с его парсингом. Для просмотра PGM под Windows возможно надо установить какой-то тул.
IrfanView например.

По поводу BMP.

Для данного конкретного требования (24bit-bmp) надо гарантировать что формула получения
цветовой яркости (уровня серого) с 3х каналов RGB у нас у всех - одинаковая.

Я использовал обычно такую. Общепринятые весовые коэфициенты для цветов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public static final double GK = 0.587;
    public static final double BK = 0.114;
    public static final double RK = 0.299;

    public static double getYPixelDouble(int color) {
        double res = (GK * ((color & 0x00FF00) >> 8) + BK * (color & 0x0000FF) + RK * ((color & 0xFF0000) >> 16)) / 255.0;
        //System.out.printf("getYPixelDouble( %08X ) = %f \n", color, res);
        return res;
    }
...
Рейтинг: 0 / 0
Задачка про остров
    #39933548
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

можно просто использовать зеленый канал, остальные игнорировать,
чтобы не было различий из-за преобразований
...
Рейтинг: 0 / 0
Задачка про остров
    #39933619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ОК. Бери вобщем любую формулу. Главное чтоб результат алгоритма по перформансу можно
было сравнивать для 2х и более алгоритмов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933716
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь результаты для зеленого канала картинки 22091638
пикселы шестиугольные, четные ряды сдвинуты вправо как здесь 22081766


Loaded ShaImg512_01.bmp
Water=0 Volume=0
Water=1 Volume=0
Water=2 Volume=0
Water=3 Volume=0
Water=4 Volume=0
Water=5 Volume=0
Water=6 Volume=0
Water=7 Volume=0
Water=8 Volume=0
Water=9 Volume=0
Water=10 Volume=0
Water=11 Volume=0
Water=12 Volume=0
Water=13 Volume=0
Water=14 Volume=0
Water=15 Volume=0
Water=16 Volume=0
Water=17 Volume=0
Water=18 Volume=0
Water=19 Volume=0
Water=20 Volume=0
Water=21 Volume=0
Water=22 Volume=0
Water=23 Volume=0
Water=24 Volume=0
Water=25 Volume=0
Water=26 Volume=0
Water=27 Volume=0
Water=28 Volume=0
Water=29 Volume=0
Water=30 Volume=0
Water=31 Volume=0
Water=32 Volume=0
Water=33 Volume=0
Water=34 Volume=0
Water=35 Volume=0
Water=36 Volume=0
Water=37 Volume=0
Water=38 Volume=0
Water=39 Volume=0
Water=40 Volume=0
Water=41 Volume=0
Water=42 Volume=0
Water=43 Volume=0
Water=44 Volume=0
Water=45 Volume=0
Water=46 Volume=0
Water=47 Volume=0
Water=48 Volume=0
Water=49 Volume=0
Water=50 Volume=0
Water=51 Volume=0
Water=52 Volume=0
Water=53 Volume=0
Water=54 Volume=0
Water=55 Volume=0
Water=56 Volume=0
Water=57 Volume=0
Water=58 Volume=0
Water=59 Volume=0
Water=60 Volume=0
Water=61 Volume=0
Water=62 Volume=0
Water=63 Volume=0
Water=64 Volume=0
Water=65 Volume=0
Water=66 Volume=0
Water=67 Volume=0
Water=68 Volume=0
Water=69 Volume=0
Water=70 Volume=0
Water=71 Volume=0
Water=72 Volume=0
Water=73 Volume=0
Water=74 Volume=0
Water=75 Volume=0
Water=76 Volume=0
Water=77 Volume=0
Water=78 Volume=0
Water=79 Volume=0
Water=80 Volume=0
Water=81 Volume=0
Water=82 Volume=0
Water=83 Volume=0
Water=84 Volume=0
Water=85 Volume=0
Water=86 Volume=0
Water=87 Volume=0
Water=88 Volume=0
Water=89 Volume=0
Water=90 Volume=0
Water=91 Volume=3822408
Water=92 Volume=3826266
Water=93 Volume=4054286
Water=94 Volume=4069682
Water=95 Volume=4078860
Water=96 Volume=4084798
Water=97 Volume=4092854
Water=98 Volume=4100668
Water=99 Volume=4109408
Water=100 Volume=4115094
Water=101 Volume=4118297
Water=102 Volume=4122321
Water=103 Volume=4126679
Water=104 Volume=4133205
Water=105 Volume=4139389
Water=106 Volume=4140981
Water=107 Volume=4144421
Water=108 Volume=4148723
Water=109 Volume=4150103
Water=110 Volume=4151779
Water=111 Volume=4152281
Water=112 Volume=4328265
Water=113 Volume=4341611
Water=114 Volume=4368740
Water=115 Volume=4373696
Water=116 Volume=4379677
Water=117 Volume=4391969
Water=118 Volume=4398657
Water=119 Volume=4406226
Water=120 Volume=4413522
Water=121 Volume=4430303
Water=122 Volume=4437483
Water=123 Volume=4443877
Water=124 Volume=4449125
Water=125 Volume=4452753
Water=126 Volume=4462669
Water=127 Volume=4466359
Water=128 Volume=4471931
Water=129 Volume=4473113
Water=130 Volume=4474185
Water=131 Volume=4477017
Water=132 Volume=4527569
Water=133 Volume=4531572
Water=134 Volume=4542319
Water=135 Volume=4552712
Water=136 Volume=4554796
Water=137 Volume=4555839
Water=138 Volume=4557583
Water=139 Volume=4558344
Water=140 Volume=4558846
Water=141 Volume=4611850
Water=142 Volume=4612574
Water=143 Volume=4613462
Water=144 Volume=4614156
Water=145 Volume=4615818
Water=146 Volume=4615970
Water=147 Volume=4616232
Water=148 Volume=4616712
Water=149 Volume=4618930
Water=150 Volume=4619512
Water=151 Volume=4620262
Water=152 Volume=4620524
Water=153 Volume=4620936
Water=154 Volume=4621992
Water=155 Volume=4622784
Water=156 Volume=4623676
Water=157 Volume=4623782
Water=158 Volume=4623920
Water=159 Volume=4624238
Water=160 Volume=4624632
Water=161 Volume=4625982
Water=162 Volume=4627312
Water=163 Volume=4627386
Water=164 Volume=4627754
Water=165 Volume=4628294
Water=166 Volume=4628678
Water=167 Volume=4629346
Water=168 Volume=4629714
Water=169 Volume=4629934
Water=170 Volume=4630366
Water=171 Volume=4630962
Water=172 Volume=4631090
Water=173 Volume=4631728
Water=174 Volume=4632232
Water=175 Volume=4632876
Water=176 Volume=4632940
Water=177 Volume=4632940
Water=178 Volume=4633472
Water=179 Volume=4634270
Water=180 Volume=4635496
Water=181 Volume=4635704
Water=182 Volume=4636352
Water=183 Volume=4636850
Water=184 Volume=4636918
Water=185 Volume=4637212
Water=186 Volume=4637478
Water=187 Volume=4637876
Water=188 Volume=4637876
Water=189 Volume=4637876
Water=190 Volume=4637876
Water=191 Volume=4637892
Water=192 Volume=4637896
Water=193 Volume=4637896
Water=194 Volume=4637896
Water=195 Volume=4637896
Water=196 Volume=4637896
Water=197 Volume=4637896
Water=198 Volume=4637896
Water=199 Volume=4637896
Water=200 Volume=4637896
Water=201 Volume=4637896
Water=202 Volume=4637896
Water=203 Volume=4637896
Water=204 Volume=4637896
Water=205 Volume=4637896
Water=206 Volume=4637896
Water=207 Volume=4637896
Water=208 Volume=4637896
Water=209 Volume=4637896
Water=210 Volume=4637896
Water=211 Volume=4637896
Water=212 Volume=4637896
Water=213 Volume=4637896
Water=214 Volume=4637896
Water=215 Volume=4637896
Water=216 Volume=4637896
Water=217 Volume=4637896
Water=218 Volume=4637896
Water=219 Volume=4637896
Water=220 Volume=4637896
Water=221 Volume=4637896
Water=222 Volume=4637896
Water=223 Volume=4637896
Water=224 Volume=4637896
Water=225 Volume=4637896
Water=226 Volume=4637896
Water=227 Volume=4637896
Water=228 Volume=4637896
Water=229 Volume=4637896
Water=230 Volume=4637896
Water=231 Volume=4637896
Water=232 Volume=4637896
Water=233 Volume=4637896
Water=234 Volume=4637896
Water=235 Volume=4637896
Water=236 Volume=4637896
Water=237 Volume=4637896
Water=238 Volume=4637896
Water=239 Volume=4637896
Water=240 Volume=4637896
Water=241 Volume=4637896
Water=242 Volume=4637896
Water=243 Volume=4637896
Water=244 Volume=4637896
Water=245 Volume=4637896
Water=246 Volume=4637896
Water=247 Volume=4637896
Water=248 Volume=4637896
Water=249 Volume=4637896
Water=250 Volume=4637896
Water=251 Volume=4637896
Water=252 Volume=4637896
Water=253 Volume=4637896
Water=254 Volume=4637896
Water=255 Volume=4637896
Water=256 Volume=4637896
Total time=1890 ms
...
Рейтинг: 0 / 0
Задачка про остров
    #39933723
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
спирарь по краю (и оба, забыл сказать, возрастают из центра)

Вот эта красивая. Заберу к себе в коллекцию. Жаль только что форум толстые картинки конвертит в jpg
автоматически. Хотел заказать еще 1024х1024.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933724
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
здесь результаты для зеленого канала картинки 22091638
пикселы шестиугольные, четные ряды сдвинуты вправо как здесь 22081766

Саш. Да тут-бы не помешало время работы алгоритма посмотреть в милисекундах.
...
Рейтинг: 0 / 0
Задачка про остров
    #39933733
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Aleksandr Sharahov
здесь результаты для зеленого канала картинки 22091638
пикселы шестиугольные, четные ряды сдвинуты вправо как здесь 22081766

Саш. Да тут-бы не помешало время работы алгоритма посмотреть в милисекундах.


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

https://github.com/Mark-Kovalyov/islands/tree/master/heightmap-synthetic
...
Рейтинг: 0 / 0
Задачка про остров
    #39933775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сюда я положу данные по картографии приближенные к реальным.

https://github.com/Mark-Kovalyov/islands/tree/master/heightmap

Ради экономии места я решил хранить данные в сжатых форматах png/jpg
Но в обоих каталогах я положил скриптик наподобие
Код: python
1.
find -regextype posix-extended -regex '.*\.(jpg|png|bmp)' -exec convert -compress none "{}" "{}.pgm" \;



Он конветит все файлы в нужный вам формат. Если заменить pgm на bmp то соответсвтенно будет сделана конверсия
в тот формат который удобен.

Кто хочет конвертить под Windows - должен установить комплект утилит ImageMagic https://imagemagick.org/index.php

Реальные данные я буду потихоньку улучшать. Сейчас там есть некоторые образцы картинок которые имеют не-квадратную
форму. Я думаю как их красиво кропнуть или скейльнуть.

Есть также одна картинка PNG которая имеет глубину цвета 16 бит на канал что меня озадачило.
Я пока не знаю что с ней делать и думаю какую выгоду с этого можно получить для теста.
...
Рейтинг: 0 / 0
Задачка про остров
    #39934113
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Заберу к себе в коллекцию. Жаль только что форум толстые картинки конвертит в jpg
автоматически. Хотел заказать еще 1024х1024.
конвертит в jpg? и этот пнг тоже что ль? тогда выложу в зипе.
Пока есть n=1000.

Однако возникли проблемы.
а) себе в коллекцию -- заметил, что забор по краю дороги при возрастании вверх берётся из "нижнего" по уровню витка (т.е. это вовсе и не забор, а тонкий пандус по краю обрыва достаточно сильно ниже уровня дороги в этом месте).
Исправлено элементарно.

б) n=1000 -- плотность шпиральных точек падает с ростом радиуса, под увеличением легко находятся точечные дырочки в "правлиьном" заборе, через к-рые будет стекать вода, если это башня, а не дыра. Казалось бы фиг с ним, но не по ТЗ.

Пока в процессе придумывания как залатать дыры (с учётом п.(в)).
в) n=1000 -- время работы! "гадский папа"(цэ), всегда надо "вовремя заткнуть фонтан идей"(цэ)
Вечером замерял при k=5(кол-во витков) dk=18(кол-во точек ~1/плотность вдоль витка - ), 50 100 200 400 1000.
1000 за 760 сек. Ок.
Навёл марафет с мини оптимизацией.
В ходе марафета производительность просела в 4 раза и 1000 теперь за 45 мин, и это фигово. Не помогли даже контекстные сравнения с предыдущими версиями и перезапуски системы. Это что-то специфичное в МЛ.

План оптимизации. Надо сделать плотность точек переменной (сделаю уменьшение тт от витка к витку ). Расчёт плотности примерно такой.
Периметр квадрата =4n пиксов. Теоретически такого кол-ва лучей в большом витке должно хватить на покрытие всех тт квадрата. Уменьшить можно из оценки
2pi*(n/2)==3146 -- так для каждого витка. А пока для 1000 имеется 5400/3=1800 точек, т.к. витки на одном расстоянии, их радиусы условно 0.2 0.4 0.6 0.8 1, Сумма==3. Дефицит имеющихся точек неохота ликвидировать только пропорциональным наращиванием их числа повсюду.
...
Рейтинг: 0 / 0
Задачка про остров
    #39934117
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
какую выгоду с этого можно получить для теста
много высоких ступенек. Любопытно взять плоские мультики))
...
Рейтинг: 0 / 0
Задачка про остров
    #39934316
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗачем уходить? Чтобы понизить связность, рассматривая только 4х соседей?
Для наглядности. До меня тоже не сразу дошло, но помучавшись с представлениями таки да - утилитарно то же самое, а даже на форуме изобразить в виде 2342345646 гораздо легче.
...
Рейтинг: 0 / 0
Задачка про остров
    #39934382
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
авторЗачем уходить? Чтобы понизить связность, рассматривая только 4х соседей?

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

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

б) n=1000 -- плотность шпиральных точек падает с ростом радиуса, под увеличением легко находятся точечные дырочки в "правлиьном" заборе, через к-рые будет стекать вода, если это башня, а не дыра. Казалось бы фиг с ним, но не по ТЗ.

Если на самых крайних поворотах с большим радиусом где-то проскочит пиксель-ямка то вся картинка
от этого станет испорчена. Но стоит-ли из за 1 пикселя удесятерять объем работ по вычислению?
Думаю не стоит.

Если ты прогонишь фильтр "Медиана" то он 100% этот битый пиксель закроет а общие характеристики
Вавилонской башни не изменятся.

Не парься долго. Отфильтруй и все. Photoshop любой версии и Gimp всегда имеют этот фильтр в комплекте.
...
Рейтинг: 0 / 0
Задачка про остров
    #39934923
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
mayton
какую выгоду с этого можно получить для теста
много высоких ступенек.
спорол фигню, виноват,показалось, что всего 16 бит.

Я не парюсь, а устраняю баги,глазами разве искать буду?
Мадиану да, попробовать можно. Только не в картинке, а в исходном линейном массиве. При плотности до dk=18 уже в 3-м витке есть дыры даже для n=400. А вот для 1024 последний виток - каждая вторая дырка, и ты ещё хочешь 7 витков вместо 5. Так что плотность всё равно увеличивать. Но теперь это быстро как прежде. Но не сегодня уже.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935161
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ещё вот что скажу. Гр. редакторы - это путь к не повторямости эксперимента. Помимо того, что потом надо будет растр внедрять в массивы, хоть и не так это важно для забора, что массив будет в хаотическом порядке и необработкоспособен. И мне это сейчас не интересно.

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

Мы достаточно обрисовали подводных камней и вариантов. Вы вольны воспользоваться помощью более умелых и быстрых умельцев. Потому что меня сейчас задерживает только забор.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935211
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фильтр медиана достаточно простой. Я могу описать алгоритм. Или даже сделаю имплементацию.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935285
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю, что такое медиана. Но здесь случай, когда нужно на плоскости сгладить линию. Предлагаетется вместо забора насыпь, а потом совместить насыпь и дорогу. Нехорошие случаи когда линия в конце вида (110001000011100000 ...). Только в несколько проходов.
Могу эту дорогу без забора закинуть сюда зипом , 1024 матрицу 7 витков, иотдельно файл спирали.

А можно, как перед этим написал, модифицировать алгоритм жука под задачу и проползти вдоль дороги без забора.

Ещё проще подождать лишний час рассчётов.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935286
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это твой MatLab такой медленный?
...
Рейтинг: 0 / 0
Задачка про остров
    #39935287
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Или даже сделаю имплементацию.
Вот кстати к этому и пусть кто хочет, берёт файлы. Просто последний виток плохо видно и лучше будет негатив.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935312
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...такой медленный?
Не замай! это недобук 10летний такой и 32-х винда. И это скрипты, всё равно что вбскрипт. И невообразимое удобство отладки. Я уже три раза садился за Эр, и каждый раз тут же события гнали меня.

n=1к*1к, 7 кругов, 60*24 точки - 1400 сек, не напрягает, легко и 48*60. Просто десятикратное наложение в самом центре суперизбыточно.

Вспомнил ещё вариант экстраполяции, отложил в конец очереди. Веду массив координат спирали для матрицы. В нём конечно нет никаких пустот) ЗАто есть и массив координат, где происходят скачки через пустоты. Т.о. каждая пара соседних коод-т в нём определяет отрезок/прям-к. Заполняешь диагональ и добавляешь в основной массив. Всё, пустот нет. Самый детерминированный и простой в реализации алгоритм.

Так что, кидать обещанныедва файла?
...
Рейтинг: 0 / 0
Задачка про остров
    #39935318
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кидай. Можешь pull-request сделать.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935320
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так не умею. А как раз и файлы готовы. Но это зип, в нём два пинга и бонус.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935331
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От же зараза, 77 одиночных дырочек в заборе(( хоть руками замазывай ...
n=1K, 7 кругов, плотность точек 60*48 на круг, 2890 сек.

Дырки начинаются в последней 3/4 круга, тяготеют к гориз-ным и вертик-м участкам. У еня чувство, что будь округление к целому иное, дырок могло бы и не быть.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Я так не умею. А как раз и файлы готовы. Но это зип, в нём два пинга и бонус.


Добавил в коллекцию синтетических карт https://github.com/Mark-Kovalyov/islands/tree/master/heightmap-synthetic
...
Рейтинг: 0 / 0
Задачка про остров
    #39935349
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. А я не могу найти Median Blur в редакторе Gimp. Помнится мне что он там был в старых версиях?
Удалили? Кому он мешал. Точно уж патент на него не нужен. Алгоритм тупой до безобразия.

Кстати предлагаю подумать над его оптимизацией.

Медиана считает яркость 8 соседних пикселов. Сортирует. Вычисляет медиану (среднюю
величину которая делит эти 8 яркостей на две группы. И ставит это среднее значение
вместо пиксела.

(Я могу ошибаться учитывается ли сам пиксел? ХЗ. Но можно учитывать. Хуже не будет).

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

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

Центральную т. ИМХО включать следует, по смыслу преобладания "правильных" значений.

Насчёт одиночных дырочек. (Чуть позже вернусь к координатам в матрице.) Имеем специфическую графику - спир-ную дорожку. Выпуклость (теоретическая) в одну сторону.
При убывании цвета к краю медианный квадрат имеет большую часть пустых значений (вне самой спирали). Предполагаю, что одиночная дурка в заборе закрасится пустым цветом из следующей дорожки ==> дырка останется.

Но ...
...
Рейтинг: 0 / 0
Задачка про остров
    #39935464
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я не понял, о концентрических бороздах. Это что ли самые первые варианты? тогда это были заведомые примеры неудачных результатов. Показать, что процесс идёт, и всё под контролем.

Подумал, а может вместо рисунка лучше дать датовый файл? координаты в double/exp формате. Кажется он в exp. Придётся оставить только уникальные точки.

Однако повод, по к-рому я пишу другой.
Почему мне никто раньше не подсказал, что в моём случае дублирование точек спирали в матрице следует устранить, до начала обработки? Всё приходится самому. Это особенно актуально в первых кругах, ибо в них большая избыточность при равномерной сетке углов.
Скорострельность ~O(n^2 * T), где Т= кол-во точек в спирали. Три вложенных цикла - это теоретическая основа. И по крайней мере запуски с n= 50 100 200 400 1000 1024 и с разной плотностью давали такую же динамику.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935466
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
При убывании цвета к краю медианный квадрат имеет большую часть пустых значений (вне самой спирали).
Поэтому мдиану надо считать если отдельно на спирали, то при вычислении серединки игнорировать пустые цвета. А если красить дорожки уже с забором, то надо игнорировать те цвета (а их большая часть в квдратике), к-рые образуют по цвету 2 явных кластера - 2 цвета высокой дорожки и соседней, что резко ниже. А 3-й кластер - как раз дырявый забор. ИМХО, только так.

Когда дорожки без забора, нужно что-то типа барельефа.

Так что стоит ли вообще? для желающих. Лучше как уже сказал: оставить только уникальные и нарастить спираль за счёт "дыр".
...
Рейтинг: 0 / 0
Задачка про остров
    #39935474
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Астанавитесь! (с)

Спираль готова. Я ее добавил в коллекцию синтетических тестов. По спирали работы закончены.
Еще я сделаю пирамиду и бассейн. И всё и можно приступать к разработке с тестами скорости.

Кстати я на клеточной тетради нарисовал свою идею топологического затопления острова. Но это
только для местности особого свойства. Где есть большие плато.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935479
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мэйтон, так ничего и не понятно.

Вы можете потрудиться , и разжевать простым языком для простых смертных, что и как и какие плюшки от вашей технологии и/или реализации. Очень хотелось бы освятить прикладную тематику. Для изначальной постановки вопросов (намеренно укрупненной) , решение замечательно сочетается с прикладными задачами. Можно придумать задачу - где нефть при прорыве скважины (фонтанировании) затопила некий регион - куда чего потечет по геодезическим картам, сколько кубов откачать и куда надо слать технику. Масштабируемо. У вас же просто теоретический интерес? Или вы копаете в область чистой математики для баз данных и всякого такого?
...
Рейтинг: 0 / 0
Задачка про остров
    #39935480
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В топике есть основная цель. Ее озвучил автор. И ее реализовал Саша Шарахов.
На этом топик можно закрыть.

Остались только скучающие завсегдатаи которые чего-то себе придумывают.
И я в том числе. Но вы - можете не беспокоиться по этому поводу. Многие
топики sql.ru текут в таком режиме.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935481
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ.
И за сокрытие вашего глубокого интереса к максимально абстрактным вещам. Хотя бы понятно, что если есть прикладной уровень, то он мне в силу понимания недоступен или его не разглашают.


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

Я догадываюсь что я иногда бываю слишком краток. Но никто - не спрашивает.
И я думаю что все в теме. Или всем пофиг.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935483
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБазовое ТЗ было в 1 посту.

Я предложил - уйти от хексагональной сетки и подойти к квадратной.
согласен, не принципиально
Расширить объем исходных данных. По сути процессить растровые картинки высот.
Не согласен, интерфейс не описан а главное задача, ударились в интерфейсы
Изучить возможности параллелизма.
Не согласен, зачем без прикладной задачи? На уже определенных растровых картинках которые не определены
Сделать дополнительное условие. Океан затапливает остров на высоту X а потом оступает на высоту Y.
Согласен, может иметь практическое применение, но скорее это описание граничных дел, в этой задаче как раз граничные дела самые главные. Как только ты математически безошибочно создашь алгоритм, последний рубеж проверки будет как раз размывание начальных условий - вроде не так друг друга поняли
Я также предложил ввести тестовый сет данных.
Согласен
Я почему-то предполагаю что среди алгоритмов не будет абсолютных
победителей а будут локальные победы на определенных типах карт.
Какую задачу решаем? Я почему то предполагаю, после очередного дня с паяльником что одно жало лучше другого. Абсолютно не формализовано. Хочется как лучше.... Ну.. Для мира... Чтобы был безоговорчный лидер .
Например имеющие плато. Александр кажется тоже писал об этом.
Взгляд со стороны, вы чего то чувствуете, но никак не можете определить где грань между идеями и реальным миром. Я слабо верю что такое даже в реальных базах данных делается. Вердикт - невиновен, спустись на землю. Материализм и прикладное в крови, а все остальное измышления на тему в попытках обобщить :D
...
Рейтинг: 0 / 0
Задачка про остров
    #39935484
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник

Я предложил - уйти от хексагональной сетки и подойти к квадратной.
согласен, не принципиально

Да это непринципиально. Браузеру тоже непринципиально было что поддерживать HTML5 или XML.
XML даже выгоднее. Строгий и однозначный парсер. Но люди подвели. Не умеют они писать в XML.
Такие они несовершенные.

А по сабжу. 100% данных по высотам (реальная картография или искусственная украденная из комьютерных
игр или созданная на Corel Bryce) всегда экспортируется в растровом формате. Не в графовом. И я когда
ставил задачу - исходил из предположения что найти такие данные будет легко. В противоположность
если вы решили играться с хексагональной сеткой то вы будете постоянно терпеть неудобства конвертации
из обще-принятого формата в свой собсвтвенный. Опять-же я исходил из возможностей людей а не из
мощности вершин графа.

В некотором вырожденном случае мы могли вытянуть остров в одно-мерный. Математика тут и там будет
одинакова.

Против графов я не имею ничего против даже более того. Моя идея основана на том что остров даже
меняя уровень затопления - имеет фиксированную топологию высот. И эта топология может (и должна
быть задана в виде графа). Это облегчит алгоритм затопления (особенно на итерациях).
...
Рейтинг: 0 / 0
Задачка про остров
    #39935486
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую задачу решаем? Я почему то предполагаю, после очередного дня с паяльником что одно жало лучше другого. Абсолютно не формализовано. Хочется как лучше.... Ну.. Для мира... Чтобы был безоговорчный лидер.
Я вам предлагаю ... просто отдохнуть от этого топика. Ну рано вы сюда зашли. Вообще всё что было написано вами выше
про стандартизацию и интерфейс исполнителей - это никому не нужно я уже понял. Люди не хотят ничего делать
под чужой интерфейс (я кстати его предлагал в самом начале).

Чтобы провести бенчмарк или сравнение алгоритмов - должны быть установлены одинаковые правила игры.
Тоесть - одинаковые исходные данные (остров). И одинаковое железо (это значит я должен взять алгоритм
Саши и адаптировав его (боже упаси делать мне нечего) - заставить его (алгоритм) работать с квадратной
сеткой высот чтобы просто сравнить его с алгоритмом пользователя iOracle, который писал код на Java
и использовал растровые картинки как исходные данные. Боже упаси сравнивать Делфи с Java,
где на коротких дистанциях (меньше секунды) Делфи побеждает сразу. Вобщем нету времени
на причёсывание чужого кода. Когда я публиковал задачу на бенчмарк трассирующего луча
на разных компилляторах - Тяпничный бенчмарк CPU (part-1) я понял что там так и не решена главная задача. Стандартизация отчотов
о бенчмарках и формализация процедуры деплоя (я хотел это сделать через Docker но руки не дошли).
Вобщем к чему я все это. Рук не хватает. Некому делать. Понимаете? Опенсорц - это такая
ненадежная штука. Нет договорных отношений - результат можно ждать завтра а можно
ждать 100 лет и все равно никто не сделает. Я просил некоторых мемберов с этим помочь
но никто не взялся.

По поводу целей. Я уже писал где-то что для меня многие топики - вторичны. Цели у меня на самом деле
могут быть другие. Например мне интересно изучать Rust и Haskell и пытаться применить их где-то в
задачах .. ну если не продуктовых то хотя-бы здесь. В форумных. Мне интересно искать различные
способы распараллеливания алгоритмов с целью запуска их в Amazon EMR (Spark/Hadoop). Опять-же.
Графы - это челлендж. Графы - сопротивляются параллелизму. Они липнут к блокировкам. Их трудно
сегментировать для независимого процессинга сегментов. Мне также было интересно погонять
OptimisticTimestamped locks (Java) на графах только для этого нужно было мясо. Много мяса.
Я имею в виду алгоритмы и цель - минимизации времени. Мне также было интересно понять
как Haskell обходится вообще без переменных и конкуренции решая сверх сложные задачи.

Вы там что-то писали про геологию и бурение нефти. Прекрасная постановка. Но я о ней вообще не думал.
Но если вы наполните этот (безумный) топик материальным и физическим смыслом (расчет объемов
залежей) или скорость затопления долины в случае аварии на дамбе - то я буду не против
и очень даже рад.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935494
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прочитал. Спасибо за развернутый ответ. Надо переварить.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935495
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эк вас обоих ...))
mayton, вопрос к вашей картинке теперь. Как вы проверяли, что в заборе нет дыр? на глаз?

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

Нас нормально, одного уровня абстракций обсуждения с попыткой понять хотя бы и в лучшем случае реализовать как-то. Я еще не ушел спать, но 99% сообщений на скл ру полный бред/или не бред, но для узкого круга лиц. Тут глобальное :)
...
Рейтинг: 0 / 0
Задачка про остров
    #39935497
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представьте меня тех директором (именно тех)ю
...
Рейтинг: 0 / 0
Задачка про остров
    #39935501
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот набросок. Моей мысли по топологичесому "затоплению". Матрица 8х8 высот представляет
собой микро остров (слева) и справа ей соответсвующий граф высок. Для расчета затопления
нам достаточно графа. Остальные дейтвия - публикация картинки с водой сугубо сервисная.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935502
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буквой Z обозначен океан. Степень этой вершины будет повыше чем у других.
Кстати на данной задаче мы можем пройтись по теории 4 красок на карте.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935558
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только щас заметил. На картинке ошибки. Где-то рёбер не хватает. Где-то высота номер 8 не свазана с буквой H.
Но думаю что идеи это достаточно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935644
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСаши и адаптировав его (боже упаси делать мне нечего) - заставить его (алгоритм) работать с квадратной
сеткой высот чтобы просто сравнить его с алгоритмом пользователя iOracle, который писал код на Java
и использовал растровые картинки как исходные данные.
Вы никак не находите принципиальных проблем?
Ну я подскажу.
Под конкретный алгоритм с КОНКРЕТНЫМ островом безусловно будет определен лидер.
Но чуть отойдите вдаль и посмотрите с издалека.
А издалека видно, что острова разные и решения будут в принципе как O(N). Изящество хромает. Дельфи / Ява. Я крамолу скажу - дельфи программист скорее всего поймет чего там ява программист написал. Такие дела.

Кокретезируйте задачу и от это уже...
Ваш остров влегкую решается без графов (решения из первых 3-ех страниц). Вы именно к графам хотите привязаться? Ноу проблем. Как только задачу формализуете. Что за хождение вдоль да около. Пока видно что вы даже больше чем просто на бумаге циферки не сподобились, как пророк, времени нет у него, нарисуйте за него.

ЗАДАЧА и ее оценка вот что интересно было в этом топике.
...
Рейтинг: 0 / 0
Задачка про остров
    #39935647
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно ладно удаляюсь из топика. Посмотрим что будет.
Но мой вам совет - чем четче поставлена задача, тем быстрее вы ее решите.
...
Рейтинг: 0 / 0
Задачка про остров
    #39936445
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Чтобы провести бенчмарк или сравнение алгоритмов - должны быть установлены одинаковые правила игры.
Тоесть - одинаковые исходные данные (остров). И одинаковое железо (это значит я должен взять алгоритм
Саши и адаптировав его (боже упаси делать мне нечего) - заставить его (алгоритм) работать с квадратной
сеткой высот чтобы просто сравнить его с алгоритмом пользователя iOracle, который писал код на Java
и использовал растровые картинки как исходные данные. Боже упаси сравнивать Делфи с Java,
где на коротких дистанциях (меньше секунды) Делфи побеждает сразу. Вобщем нету времени
на причёсывание чужого кода.


Здесь "адаптированный" алгоритм на все случаи жизни:
для 4-, 6- и 8-угольных пикселей и произвольных размеров карты.

Он умеет работать как со случайно сгенерированной картой,
так и с картой из файла 24bpp *.bmp (берет зеленый канал).

Он немного быстрее предыдущего за счет того, что при инициализации
карта обрамляется рамкой в 1 ячейку и поэтому в основной процедуре
не нужно проверять выход за границу массива.

Функция FillWater(aLinkCount, aWater) теперь имеет 2 параметра:
связность ячеек и уровень прилива. Перед тем как ее вызывать
необходимо прочитать карту высот из bmp-файла функцией ReadMap
или сгенерировать процедурой GenerateMap.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
//Остров разбит на правильные шестиугольные ячейки площади 1 различной высоты над уровнем моря.
//Найти максимальный объем воды, которая не стечет в море после долгих проливных дождей
//или прилива заданной высоты. Решить ту же задачу для квадратных ячеек с 4 и 8 соседями.
type
  TCell= packed record
    Height: byte;
    Level: byte;
    Dir: shortInt;
    end;

  TSetLevel= procedure(xy: integer);

var
  XCount: integer;
  YCount: integer;
  XYCount: integer;
  WHCount: integer;
  Map: packed array of TCell;
  Order: array of integer;
  Links: array[0..7] of integer;

//чтение карты из файла
function ReadMap(const aFileName: string): boolean;
var
  bm: TBitMap;
  p: pByteArray;
  x, y: integer;
begin;
  bm:=TBitmap.Create;
  try
    bm.LoadFromFile('..\bmp\ShaImg512_01.bmp');
    Result:=(bm.PixelFormat=pf24bit);
    if Result then begin;
      WHCount:=bm.Width * bm.Height; SetLength(Order, WHCount);
      XCount:=bm.Width+2;
      YCount:=bm.Height+2;
      XYCount:=XCount * YCount; SetLength(Map, XYCount);
      for x:=0 to XCount-1 do with Map[0*XCount+x] do Height:=0;
      for x:=0 to XCount-1 do with Map[(YCount-1)*XCount+x] do Height:=0;
      for y:=1 to YCount-2 do begin;
        pChar(p):=bm.ScanLine[y-1];
        for x:=0 to XCount-1 do with Map[y*XCount+x] do
          if (x=0) or (x=XCount-1) then Height:=0
          else begin;
            Height:=p[1]; //G of RGB
            inc(pChar(p),3);
            end;
        end;
      end;
  finally
    bm.Free;
    end;
  end;

//генерация случайной карты заданных размеров с начальным значением и диапазоном ГСЧ
procedure GenerateMap(aWidth: integer= 0; aHeight: integer= 0;
                      aSeed: integer= 0; aRange: integer= 256);
var
  x, y: integer;
begin;
  if aWidth=0 then aWidth:=10000;
  if aHeight=0 then aHeight:=aWidth;
  WHCount:=aWidth * aHeight; SetLength(Order, WHCount);
  XCount:=aWidth+2;
  YCount:=aHeight+2;
  XYCount:=XCount * YCount; SetLength(Map, XYCount);
  RandSeed:=aSeed;
  for y:=0 to YCount-1 do begin;
    if (y=0) or (y=YCount-1)
    then for x:=0 to XCount-1 do with Map[y*XCount+x] do Height:=0
    else for x:=0 to XCount-1 do with Map[y*XCount+x] do
      if (x=0) or (x=XCount-1)
      then Height:=0
      else Height:=Random(aRange);
    end;
  end;

//вычисление таблицы смещений для перехода к каждому из d соседей
procedure DefineLinks(d: integer);
begin;
  Links[0]:=-1;
  Links[1]:=+1;
  case d of
    4: begin;
         Links[2]:=-XCount;
         Links[3]:=+XCount;
         end;
    6: begin;
         Links[2]:=-XCount;
         Links[3]:=+XCount+1;
         Links[4]:=-XCount+1;
         Links[5]:=+XCount;
         end;
    8: begin;
         Links[2]:=-XCount-1;
         Links[3]:=+XCount+1;
         Links[4]:=-XCount;
         Links[5]:=+XCount;
         Links[6]:=-XCount+1;
         Links[7]:=+XCount-1;
         end;
    end;
  end;

//сортировка ячеек карты по высоте
procedure SortMap;
var
  Counts: array[byte] of integer;
  h, x, y, xy, sum, cnt: integer;
begin;
  for h:=Low(Counts) to High(Counts) do Counts[h]:=0;
  for y:=1 to YCount-2 do for x:=1 to XCount-2 do inc(Counts[Map[y*XCount+x].Height]);
  sum:=0;
  for h:=Low(Counts) to High(Counts) do begin;
    cnt:=sum; sum:=sum+Counts[h]; Counts[h]:=cnt;
    end;
  for y:=1 to YCount-2 do begin;
    for x:=1 to XCount-2 do begin;
      xy:=y*XCount+x;
      h:=Map[xy].Height;
      cnt:=Counts[h]; Counts[h]:=cnt+1;
      Order[cnt]:=xy;
      end;
    end;
  end;

//процедура среза лишней воды для 4-связанных ячеек
procedure SetLevel4(xy: integer);
var
  d, xy2: integer;
  cut: byte;
begin;
  with Map[xy] do begin;
    cut:=Level;
    if Dir<high(Dir)-1 then exit; //ячейка обработана ранее
    Dir:=-1;
    end;
  d:=0;
  while true do begin;
    while d<4 do begin;
      xy2:=xy + Links[d];
      with Map[xy2] do if Level>cut then begin;
        if Height>cut then Level:=Height
        else begin;
          xy:=xy2;
          Level:=cut; Dir:=d xor 1; d:=-1;
          end;
        end;
      inc(d);
      end;
    d:=Map[xy].Dir;
    if d<0 then break;
    xy:=xy+Links[d];
    d:=d xor 1 + 1;
    end;
  end;

//процедура среза лишней воды для 6-связанных ячеек
procedure SetLevel6(xy: integer);
var
  d, ofs, xy2: integer;
  cut: byte;
begin;
  with Map[xy] do begin;
    cut:=Level;
    ofs:=Dir-(high(Dir)-1); //ofs=1 - нечетный ряд, ofs=0 - четный ряд сдвинут вправо
    if ofs<0 then exit; //ячейка обработана ранее
    Dir:=-1;
    end;
  d:=0;
  while true do begin;
    while d<6 do begin;
      xy2:=xy + Links[d]; if d>=2 then xy2:=xy2 - ofs;
      with Map[xy2] do if Level>cut then begin;
        if Height>cut then Level:=Height
        else begin;
          xy:=xy2; if d>=2 then ofs:=ofs xor 1;
          Level:=cut; Dir:=d xor 1; d:=-1;
          end;
        end;
      inc(d);
      end;
    d:=Map[xy].Dir;
    if d<0 then break;
    xy:=xy+Links[d];
    if d>=2 then begin; xy:=xy - ofs; ofs:=ofs xor 1; end;
    d:=d xor 1 + 1;
    end;
  end;

//процедура среза лишней воды для 8-связанных ячеек
procedure SetLevel8(xy: integer);
var
  d, xy2: integer;
  cut: byte;
begin;
  with Map[xy] do begin;
    cut:=Level;
    if Dir<high(Dir)-1 then exit; //ячейка обработана ранее
    Dir:=-1;
    end;
  d:=0;
  while true do begin;
    while d<8 do begin; //единственное отличие от SetLevel4, константа ускоряет код на 5%
      xy2:=xy + Links[d];
      with Map[xy2] do if Level>cut then begin;
        if Height>cut then Level:=Height
        else begin;
          xy:=xy2;
          Level:=cut; Dir:=d xor 1; d:=-1;
          end;
        end;
      inc(d);
      end;
    d:=Map[xy].Dir;
    if d<0 then break;
    xy:=xy+Links[d];
    d:=d xor 1 + 1;
    end;
  end;

//заполнение карты из aLinkCount-связанных ячеек приливом уровня aWater
function FillWater(aLinkCount, aWater: integer): int64;
var
  i, x, y, xy, MinHeight, MaxHeight: integer;
  SetLevel: TSetLevel;
begin;
  Result:=0;
  case alinkCount of
    4: SetLevel:=@SetLevel4;
    6: SetLevel:=@SetLevel6;
    8: SetLevel:=@SetLevel8;
    else exit;
    end;
  DefineLinks(aLinkCount);
  SortMap;
  MinHeight:=Map[Order[0]].Height;
  MaxHeight:=Map[Order[WHCount-1]].Height;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do with Map[y*XCount+x] do begin;
    if (y<=1) or (y>=YCount-2) or (x<=1) or (x>=XCount-2)
    then Level:=Height
    else Level:=MaxHeight;
    Dir:=(y and 1) + (high(Dir)-1); //слагаемое (y and 1) - пометка нечетных рядов, необходимая для SetLevel6
    end;
  if aWater>MaxHeight then begin;
    for i:=0 to WHCount-1 do begin;
      xy:=Order[i];
      with Map[xy] do if Level=Height then SetLevel(xy);
      end;
    for y:=1 to YCount-2 do for x:=1 to XCount-2 do with Map[y*XCount+x] do
      Result:=Result+(Level-Height);
    end
  else if aWater>MinHeight then begin;
    for i:=0 to WHCount-1 do begin;
      xy:=Order[i];
      with Map[xy] do if Level=Height then begin;
        if Height>=byte(aWater) then break;
        SetLevel(xy);
        end;
      end;
    for y:=1 to YCount-2 do for x:=1 to XCount-2 do with Map[y*XCount+x] do
      if Level<byte(aWater) then Result:=Result+(Level-Height);
    end;
  end;

...
Рейтинг: 0 / 0
Задачка про остров
    #39936447
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маловато отпущено времени на исправление ошибок, не успел заменить
в ReadMap константу '..\bmp\ShaImg512_01.bmp' на параметр aFileName
...
Рейтинг: 0 / 0
Задачка про остров
    #39937313
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, мальчики! Решаем глобальные проблемы, быстренько посчитайте мне водоизмещение синей цистерночки. Файл приложен, чёрный цвет предлагаю игнорировать, белый - типа высота до небес.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937338
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98,

Чтобы каждый не изобретал свой способ конвертирования,
неплохо было бы убрать с картинки лишнюю хрень,
перевести в градации серого и сохранить в bmp.

Опять же неясно, какие пикселы в задаче 4, 6 или 8-угольные?
...
Рейтинг: 0 / 0
Задачка про остров
    #39937352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используем 4 связность.

Вода по диагонали не протекает.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937378
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, будет сделано!
- Пиксы в сечении квадратные.
- Разрешите оставить чёрные точки на предмет игнорирования?! или ... и их тоже, ликвидировать?
- Белый цвет вокруг мира сего?..

(А всё потому, что нет единого стандарта.)
...
Рейтинг: 0 / 0
Задачка про остров
    #39937379
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша ты не против если я твои исходники буду копипастить в свой репозиторий? Мне так удобнее
и вносить изменения и тестить.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937394
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

да, конечно, для этого и привел
...
Рейтинг: 0 / 0
Задачка про остров
    #39937395
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Aleksandr Sharahov, будет сделано!
- Пиксы в сечении квадратные.
- Разрешите оставить чёрные точки на предмет игнорирования?! или ... и их тоже, ликвидировать?
- Белый цвет вокруг мира сего?..

(А всё потому, что нет единого стандарта.)


Черные (0) - это эквивалент нулевой высоты, белые(255) - макс. высота.
Все точки карты принадлежат острову.

Поэтому, чтобы вода не задерживалась по краям карты,
достаточно их сделать одинаковой нулевой высоты.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937514
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Палитра bmp какая? 256 индексная или 24b r=g=b ?
...
Рейтинг: 0 / 0
Задачка про остров
    #39937517
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Палитра bmp какая? 256 индексная или 24b r=g=b ?


24bpp: r=g=b

а если 24bpp r<>g<>b, то просто считаем по зеленому каналу.

т.е. всегда берем зеленый
...
Рейтинг: 0 / 0
Задачка про остров
    #39937519
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда я предлагал ppm/pgm - я хотел избавить вас от обсуждения стандартов кодирования графики. Их много. Я вы закопаетесь.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937536
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не удалось собрать.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
fpc -Mdelphi -CX -O3 -XX -vewnhi -Fi. -Fu. -FU. islands2.lpr
Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Free Pascal Compiler version 3.0.4+dfsg-18ubuntu2 [2018/08/29] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling islands2.lpr
islands2.lpr(25,7) Error: Identifier not found "TBitMap"
islands2.lpr(25,14) Error: Error in type definition
islands2.lpr(26,6) Error: Identifier not found "pByteArray"
islands2.lpr(26,16) Error: Error in type definition
islands2.lpr(29,7) Error: Identifier not found "TBitmap"
islands2.lpr(31,8) Error: Illegal qualifier
islands2.lpr(32,17) Error: Illegal qualifier
islands2.lpr(32,29) Error: Identifier not found "pf24bit"
islands2.lpr(34,19) Error: Illegal qualifier
islands2.lpr(34,30) Error: Illegal qualifier
islands2.lpr(35,18) Error: Illegal qualifier
islands2.lpr(36,18) Error: Illegal qualifier
islands2.lpr(41,9) Error: Illegal type conversion: "<erroneous type>" to "PChar"
islands2.lpr(41,22) Error: Illegal qualifier
islands2.lpr(45,23) Error: Illegal qualifier
islands2.lpr(46,17) Error: Illegal type conversion: "<erroneous type>" to "PChar"
islands2.lpr(51,8) Error: Illegal qualifier
islands2.lpr(264,6) Fatal: Syntax error, "BEGIN" expected but "end of file" found
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
...
Рейтинг: 0 / 0
Задачка про остров
    #39937537
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я Вообще могу матрицу дать, а эти ППМ и т.п. ещё не повсеместны.
Про зелёный раньше надо было.
Короче зип-файл 24b, серый.
Не обошлось без вмешательства ручками. В основном в Канадине и где-то на Филлипинах, что ли.
Претензии принимаются только к формату.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937540
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPM это достаточно старый формат. Для поддержки его просмотра под
Windows надо установить эту штуку https://www.irfanview.com/
Под Linux - он достаточно коробочный и интегрирован лучше.

Собственно если-бы вы были участниками бенчмарка от 2015 года
где мы по этим техническим нюансам прошлись, то вы бы сейчас не тратили время
на поиски кодеков и файловых форматов а просто делали бы алгоритм как таковой.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937541
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

не закопаемся)

мы используем 1 устоявшийся стандарт:
bmp 24bpp, а в нем берем зеленый канал

это проще, чем перегонять bmp во что-то другое, невизуальное, а потом это что-то загружать.

P/S/ визуализацию заказывали? - распишитесь в получении )
...
Рейтинг: 0 / 0
Задачка про остров
    #39937544
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937548
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, утруждать заказчика усилиями по визуализации как бы моветон, а обработка "гео"-данных без предварительной визуализации - это, с чем бы сравнить,.. как поцелуи через платочек.

З.Ы. я пропустил, целоваться ещё не запретили в связи с новыми бяками? а то рукопожатия уже чуть ли не уголовка ...
...
Рейтинг: 0 / 0
Задачка про остров
    #39937556
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не против визуализации. Я говорю о том что вы несколько страниц потратили на обсуждение
как получить яркость из RGB в то время как для меня это решенная задача давно. Вы тратите
время на обсуждение разрядности и свойств bmp и это не приближает решения а просто его
кастомизирует.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937635
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает? Не трогай!
Я тоже не против более удобных форматов в плане АПИ, только ...
Достала уже эта низкоуровневость кодёрства. Раз попробовал изготовить в ППМ (нечто вроде Хэллоу, воулд). Оказалась у меня пара прог, к-рые ППМ знают. Обе грязно выругались.
Поэтому хотел бы знать на примере, как ППМ облегчает изготовление яркости (либо почему делает это изготовление ненужным)? ХМЛ облегчает формовку данных? и ведь тоже все хотят плагинов, апишек и фреймворков. Вот когда мне понадобится сделать файл малочитаемым другими (подобно ПДФу), наверное тогда возьму ППМ.

Но я против несовместимостей и всевозможных нововведений ради нововведений. Видимо стабильность в программировании кому-то не даёт покоя,браузеры тоже: тот работает, этот уже нет и т.д. Вавилонская башня.
Вот зачем цепляются за сохранность синтаксиса оператора свитч (срр)? ради совместимости с одним единственным нестандартным применением 40лет назад? кому этот приём щас наф нужен ...
...
Рейтинг: 0 / 0
Задачка про остров
    #39937638
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С яркостью, кстати, секрет Полишенеля. Ещё в МС ДОС из демок КуБэ формулу стянул. Но и книжек об этом тогда хватало. Где-то записано, там ~0.11 R вроде. Не важно ...
...
Рейтинг: 0 / 0
Задачка про остров
    #39937857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98, как будет угодно.

Я просто добавлю что BMP- это один из самых неудачных графических форматов.
Его вертикальна организация скан-линий такова что началу файла соответствует
конец видеопамяти. Это вкратце. А в частности чтобы прочитать тебе файл - на уровне
диска - тебе надо читать его сзаду-наперед. И заполнять банки видеопамяти (это
я говорю в терминах VGA/SVGA) в прямом порядке. Либо наоборот. Читать файл
прямо и писать в память от младших адресов к старшим. Технически - это неудачная
идея. И хотя данные внутри одной строки лежат более менее последовательно
в общем работать с фрагментом крупной картинки частями - неудобно. И алгоритмы
сжатия для bmp были реализованы только для индексного (палитрового режима).
True-color-же остался толстым и несжатым. Хотя поджать его с помощью дифференциального
кодека было очень легко. Благо бесплатный gzip всегда существовал.

Я также встречал экзоточески редкие под-виды BMP с разрядностью 16 бит на 3 цвета.
Они на 80% несовместимы с большей частью ПО. Я гарантирую что под Линуксом
вы скорее всего такой файл не откроете. Тоесть вроде оно и стандартно но
покрытие совместимости закрыло лишь самые популярные его разрядности цвета.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937865
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

Или (хопа!) - создаешь 256 цветный индексированный палитровый bmp. Что в целом меньше
по курсу рубля аж в 3 раза и имеет профит для промышленности и народного хозяйства.

Вот так вот дедушка.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937941
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не путай свою шерсть с государственной (c)
Тебе, может, лучше подойдет другой формат.

А мне эти bmp только для тестов нужны,
и формат выбран исключительно для удобства
отладки и тестирования.
...
Рейтинг: 0 / 0
Задачка про остров
    #39937944
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да развеж я могу запретить?
...
Рейтинг: 0 / 0
Задачка про остров
    #39938024
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то и РСХ пришлось самому распаковывать. А когда потом всё появилось, он не нужен стал.
И тем е менее, обходя тупые углы БМП, его использование нами, виндусятами , стало типа стандартным в АПИ (ну, одним из ...) А описанное выше неудобство относится к низкому уровню, от к-рого хочется шарахнуться (ненароком скаламбурил). И тут возникает ППМ, для к-рого нетути АПИ, и нафига тогда текстовый формат нужен?..

Поэтому лучше послушать преимущества ППМ, ускоряющие и облегчающие работу прогера. Пусть не в гигантских конторах, а как мы, факультативно, хобби и т.п.
В общем, получился "островной" трёп, но я согласен слушать, не перебивая, без дискуссии.
...
Рейтинг: 0 / 0
Задачка про остров
    #39941979
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер Мэйтон так и не предоставил свой чудесный вариант. Так... за спасибо массами руководит :D Мэйтон, колись уже , чего затеял, ты вроде обещал. Я запомнил ;)
...
Рейтинг: 0 / 0
Задачка про остров
    #39942016
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0) а) VOLUME = 0 б) Все крайние плиты обозначаем как сухие
1) Идем в цикле CURRENT_LEVEL = от MIN_LEVEL = 1 до MAX_LEVEL = 6
2) Применяем следующий алгоритм
а) Если рядом с сухой плитой, есть плита не ниже её (>=), обозначаем её как сухую
б) повторяем (а) пока мы можем обозначить хоть одну новую (ранее не помеченную) плиту сухой
в) Находим все мокрые (не сухие) плиты чей уровень равен CURRENT_LEVEL и для каждой VOLUME += 1, также увеличиваем уровень этих плит на 1 (== CURRENT_LEVEL+1)
3) уходим на цикл из 1 и повторяем п (2) (маркировку плит как сухих оставляем как есть с предыдущего витка цикла). Если все плиты стали сухими, то цикл из п1 можно прервать (break)
...
Рейтинг: 0 / 0
Задачка про остров
    #39942021
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник,

ладно. Расскажу. Следующая моя гипотеза оптимизации основана на MipMapping
https://ru.wikipedia.org/wiki/MIP-текстурирование

Только вместо функции avg я планировал сделать min/max. И протестировать решение
этой задачи на цепочке карт высот меньшего размера.

Моя гипотеза основана на том что для средней карты (не белый шум и не вырожденная гора)
мы быстрее будем отсекать варианты затекания воды в те квадраты где подходящих высот нет.

В силу своего перфекционизма я немножко застрял на новом языке Rust в котором я пока
начинающий и там... пошло-поехало (аж на 20 топиков вопросов хватит).

Так што берите мою гипотезу если хотите и проверяйте.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942031
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я пока буду нубствовать в Rust.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И в BigData. Отвлекли меня... черти.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942081
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подозреваю, что вы чертями назвали всех как канальями Боярский :)
Но никак не сходится - что вы выкатите рещение, этож про алгоритмы а не про языки. Алгоритмически можно разжевать для недалеких? :)
...
Рейтинг: 0 / 0
Задачка про остров
    #39942082
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не.. серьезно уже и без шуток, что вы затеяли? Алгоритмически все примерно одинаково, но столь пристальное внимание навевает мысли что что-то проглядели. Что именно? Без языков, человеческими словами.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942084
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритмически - все просто.

1) Дана карта высот. H(x,y).
2) Строим множество mip-карт. Пускай это будет H(i)(x,y) по формуле = min(....)
короче каждый следующий уровень содержит в 1 элементе минимум от четырех элементов
предыдущего уровня.
3) Решаем задачу циклического затопления острова. Начиная с самых мелких mip-карт.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942085
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник
Я подозреваю, что вы чертями назвали всех как канальями Боярский :)
Но никак не сходится - что вы выкатите рещение, этож про алгоритмы а не про языки. Алгоритмически можно разжевать для недалеких? :)

Я прошу прощения. Черти - это не к вам. Это мои дорогие кастомеры меня отвлекают.
Им щас нужна автоматизация тестирования на технологиях которые тестировщики не знают.
Вот просят меня помогать. А я в гробу видел все эти Spark/EMR.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942225
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1) Дана карта высот. H(x,y).
2) Строим множество mip-карт. Пускай это будет H(i)(x,y) по формуле = min(....)
короче каждый следующий уровень содержит в 1 элементе минимум от четырех элементов
предыдущего уровня.
3) Решаем задачу циклического затопления острова. Начиная с самых мелких mip-карт.
Не ясно :) Для каких вы целей прикручиваете. Как сказал один человек давно кому-то, если кто-то может объяснить самому тупому, то тогда он точно дока в этом вопросе. Мне кажется мы в разных каких то плоскостях говорим.
...
Рейтинг: 0 / 0
Задачка про остров
    #39942228
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да выкатите свое решение в конце концов, тогда будет предметно!
...
Рейтинг: 0 / 0
Задачка про остров
    #39942230
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АСУ ТПшник, да забей уже на этот топик. Я может выкачу. Но у меня перед этим форумом - минимальные обязательства.

Напиши сам своё. Вижу что скучаешь.
...
Рейтинг: 0 / 0
Задачка про остров
    #39951592
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока остров еще не сдох. Выложу свой рисунок mip-map.
...
Рейтинг: 0 / 0
Задачка про остров
    #39951684
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял, это что-то вроде стягивания графа в точку?
...
Рейтинг: 0 / 0
Задачка про остров
    #39951723
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Внизу нарисовано как остров 8х8 я привожу к 4х4 и 2х2.

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


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