| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > Нахождение островов |
| Автор: reddevil 26.9.2005, 15:12 | ||||||
| Помогите решить задачку(что-то в роде олимпиадной). Матрица(произвольного размера)имитирует воду и остова. Вода представленна как 0, а остров как 1. Островом считается набор близлежащих единиц. Необходимо: написать прогу, которая: 1. Считает количество островов 2. Размер каждого острова 3. Координаты острова 4. сохраняет данные в структуре Я решил сначало описать структуру остров
Затем объявил глобаьно(чтоб не перекидывать из функции в функцию): 1. массив воды и островов(map) 2. размер карты 3. массив соседних координат на карте 4. количество островов
Иницализировал карту островами и обеспечил вывод на консоль вот вобщем весь код(не весь, в остальном я сам запутался, не хочу путать других) Функции void Skan_Map(Land*); и Land *Add_Island(Land*island,int x,int y); не работают, поставил в качестве примера.
Дальше я запутался как гулять по островам считая количество соседних едениц подскажите пожалуйста: Оно вроде все просто, проверил есть ли рядом суша, если да перешел на нее, где был затопил(чтоб не мешала), проверил дальше. Но если рядом не один участок суши как пойти одновременно на два и более участка, или как запомнить это место, а потом на него вернутья? Вобщем что дальше только догадка, которую не могу реализовать. |
| Автор: maxim1000 26.9.2005, 21:27 |
| еще один вариант, несколько быстрее, как мне кажется: тут вообще нужен только один проход смотрим ан первую строку, она состоит из отрезков суши и воды по очереди каждый отдельный отрезок суши называем отстровом, даем ему номер, можно объект какой-нибудь для него создать - неважно переходим на следующую строку и смотрим... какие варианты могут быть: 1. остров тупо продолжается (в общем-то ничего особенного не делаем) 2. остров заканчивается (сохраняем его в массиве "готовых" островов) 3. два острова (или больше) объединяются (один удалить, другой оставить) 4. начинаестя новый (создать новый объект/выделить новый номер) |
| Автор: maxim1000 26.9.2005, 22:25 | ||
| попробовал изобразить это в C++ предположение1:имеется класс CIsland с конструктором CIsland(int x,int y) предположение2:вехняя строчка и левый столбец - все в воде (просто для удобства) на вход дается массив, куда записываются найденные острова возвращается количество...
|
| Автор: reddevil 26.9.2005, 23:38 |
| Да написано клево, вот только мне опыта не хватает это разобрать, P.S: От дополнительных коментариев по этому поводу не откажусь. |
| Автор: maxim1000 27.9.2005, 12:10 | ||||
просто код оказался короче, если предположить, что их нет впрочем, это не такое уж натянутое предположение - можно их добавить вручную иначе нужно будет обрабатывать специальным образом лувый столбец и первую строку - алгоритм не изменится, просто добавится несколько неинтересных строк...
для того, чтобы прочувствовать этот алгоритм, можно посоветовать вот что: 1. берем лист в клеточку 2. рисуем на нем какие-то острова 3. идем построчно слево направо, сверху вниз 4. пытаемся решить задачу используя только соседние клеточки 5. каждый участок сущи должен быть пронумерован 6. соединенные участки суши должны быть пронумерованы одинаковыми числами (по возможности) 7. если не получается (например, оказывается, что сверху один номер, а слева другой), пишем в клеточку любой из этих двух, а сбоку на листочке пишем что-то типа "5=9", т.е. острова 5 и 9 на самом деле один и тот же |
| Автор: reddevil 28.9.2005, 08:50 |
| Спасибо |