|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|
Задача на поиск луж в матрице27.10.2015, 17:10. Показов 2363. Ответов 18
Метки нет (Все метки)
Всем доброго дня.
Есть задача, который день бьюсь, не могу придумать алгоритм. "Consider a matrix of integers MxN, where each value represents a height of imaginary landscape. Now, the whole figure is put into the water, deep enough to cover the highest peak, and is brought back to the light. Write a program to compute puddles remained in the landscape." Идеи на сегодняшний момент таковы. Нужно отсортировать по убыванию высоты и послойно "вытаскивать" матрицу из воды. Допустим, максимальная высота 500. Создаем пустую матрицу, идентичную по размерам исходной. Проверяем, где в исходной матрице есть "столбы" с высотой 500, в этом месте новой матрицы ставим 1. Если в текущей точке высота не 500, в новой матрице пишем ноль. Таким образом, для каждой высоты получим матрицу из нулей и единиц. Теперь задача сводится к нахождению замкнутых контуров с нулями в новой матрице, это и будут искомые лужи. Проблема состоит в том, что я не могу подобрать нужный алгоритм для поиска этих самых контуров. Потому что лужа может быть и формы кольца, и лужа в луже в луже... Идей возникает куча, но все они нерабочие. =\
0
|
|
| 27.10.2015, 17:10 | |
|
Ответы с готовыми решениями:
18
Поиск в матрице, задача Задача на бинарный поиск в матрице |
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|
| 27.10.2015, 17:41 [ТС] | |
|
Вот картинка, которая может помочь визуализировать задачу.
0
|
|
|
90 / 87 / 11
Регистрация: 20.11.2008
Сообщений: 724
|
||
| 28.10.2015, 08:44 | ||
|
0
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|
| 28.10.2015, 09:33 | |
|
0
|
|
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
||||||||
| 28.10.2015, 10:45 [ТС] | ||||||||
Добавлено через 11 минут Например, у нас есть следующие различные высоты в матрице: 500, 300, 200, 0. Мы начинаем с высоты 500, создаем новую матрицу из 0 и 1 и ищем лужу из нулей. Если для этой высоты мы уже нашли лужу объемом в 2 клетки, то мы точно знаем, что эта лужа сохранится вплоть до уровня 300. Таким образом мы на уровнях с 500 по 300 получаем (500 - 300) * 2 = 400 клеток (пусть будут литры вместо клеток) лужи. Смотрим высоту 300. Допустим, для этой высоты мы нашли лужу в 1 клетку. (Визуально это выглядит как столб высотой в 300 метров среди столбов в 500: 500 500 500 500 500 300 лужа 500 500 500 500 500). Таким образом на уровнях с 300 по 200 наша лужа имеет объем в 100 литров. Общая лужа 400 + 100 = 500 литров. Смотрим уровень в 200. Допустим, на этом этапе мы ничего не нашли. Значит, итог - лужа в 500 литров с определенными координатами в матрице. Надеюсь, понятно объяснила. Добавлено через 4 минуты На данном этапе успехи таковы. Алгоритм обхода матрицы из 0 и 1 на предмет поиска замкнутого контура из 1 найден (он и на момент создания темы уже был). Алгоритм нахождения нулей и других единиц в этом контуре найден, но еще не реализован (в этом и была загвоздка, собственно). Буду пробовать, надеюсь, получится.
0
|
||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|||
| 28.10.2015, 10:49 | |||
|
Добавлено через 2 минуты
0
|
|||
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|||
| 28.10.2015, 10:51 [ТС] | |||
|
Добавлено через 52 секунды
0
|
|||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
||
| 28.10.2015, 11:47 | ||
|
Для наличия лужи необходимо и достаточно наличие клетки (или группы клеток одинаковой высоты), все соседи которой имеют большую высоту. Очевидно, что такая клетка (группа клеток) не может быть расположена с краю.
Алгоритм: Перебираем все клетки 1. Если клетка принадлежит уже найденной луже, переходим к следующей клетке 2. Если клетка не является впадиной (есть более низкий сосед), переходим к следующей клетке 3. Помечаем клетку как лужу и определяем её размеры: 3.1. Находим самую низкую граничащую клетку-кандидат 3.2. Если у кандидата есть более низкий "сухой" сосед, то больше нельзя увеличть лужу 3.3. Если у кандидата есть более низкий сосед, принадлежащий другой луже, то проверяем, можно ли объединить лужи 3.4. Иначе (все соседи кондидата либо выше кандидата, либо принадлежащие данной луже) добавляем кандидата к луже и продолжаем с 3.1. Добавлено через 3 минуты Нашли замкнутый контур из единиц. Все нули внутри него будут лужей. Перед переходом к следующей высоте заполняем все лужи единицами (чтобы не мешали поиску новых луж).
1
|
||
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
||||||||
| 28.10.2015, 13:22 [ТС] | ||||||||
0
|
||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|||
| 28.10.2015, 13:27 | |||
|
0
|
|||
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
||||||||
| 28.10.2015, 13:40 [ТС] | ||||||||
0
|
||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|||
| 28.10.2015, 14:00 | |||
|
У каждой лужи есть как минимум один локальный минимум глубины. И каждый локальный минимум глубины принадлежит какой-то луже. Поэтому "Для наличия лужи необходимо и достаточно наличие клетки (или группы клеток одинаковой высоты), все соседи которой имеют большую высоту." Суть моего алгоритма: мы находим локальный минимум глубины и начинаем "добавлять воду, пока не польётся через край". Добавлено через 4 минуты Мы нашли замкнутый контур из единиц на высоте 500. Все нули внутри этого контура будут лужей (одной или несколькими лужами). Уровень поверхности воды в этой луже будет 500. Заменяем нолики внутри контура на единички, уменьшаем высоту и опять ищем замкнутый контур.
0
|
|||
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|||
| 28.10.2015, 14:17 [ТС] | |||
|
Можете дать пару пояснений по Вашему алгоритму?
0
|
|||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|||||||
| 28.10.2015, 14:35 | |||||||
|
Например, тут:
правая единица не принадлежит луже - поэтому она "сухой" сосед
0
|
|||||||
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|||||||||
| 28.10.2015, 15:13 [ТС] | |||||||||
Это двойка. Теперь
0
|
|||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
||
| 28.10.2015, 16:30 | ||
|
0
|
||
| 29.10.2015, 08:55 | |
|
1. Помечаем все крайние клетки как "сухие" и находим среди них клетку (X) с минимальной высотой. Это будет текущая максимально возможная высота водяного столба (h)
2. "Расползаемся" от X обычным ДНФ (всю жизнь путаю это название). На каждом шаге имеем контейнер всех просмотренных. Для каждой добавляемой: - если есть "сухой" сосед с высотой h2 < h, то среди всех просмотренных выбираем максимальный по высоте (и >= h2), помечаем его "сухим", и принимаем его высоту как новый h. Опять начинаем с той же клетки X (но уже с меньшим h). Это наверняка неоптимально, но надежно. Если же такого не нашлось, то h = h2 (просто понизили высоту столба без перезапуска) - иначе если высота просматриваемой >= h, то она становится "сухой" и в контейнер просматриваемых не включается. - иначе никаких выводов делать пока нельзя, включаем эту клетку в расползание Если некуда больше ползти, все клетки контейнера = лужа с высотой h. Выбираем новую клетку X и возвращаемся к 2 Добавлено через 1 час 1 минуту Наверное "перемудрил" - ведь если начинаем с "минимальной сухой", то не вижу как можем найти др "сухую" с меньшей высотой? Поэтому никакого "перезапуска" возникать не должно. Ну ладно
0
|
|
|
41 / 0 / 0
Регистрация: 07.08.2013
Сообщений: 41
|
|
| 29.10.2015, 16:24 [ТС] | |
|
Задача решена в https://www.cyberforum.ru/cpp-beginners/thread1563805.html.
Просто и красиво) Всем спасибо за помощь!
0
|
|
| 29.10.2015, 17:21 | |
|
0
|
|
| 29.10.2015, 17:21 | |
|
Помогаю со студенческими работами здесь
19
Анимация - испарение луж У меня задача,в матрице,заменить первый отрицательный элемент максимальным элементом. Проходить по матрице слева направо,сверху вниз Задача по матрице Задача по матрице Задача по матрице Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|