![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
reddevil |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Помогите решить задачку(что-то в роде олимпиадной).
Матрица(произвольного размера)имитирует воду и остова. Вода представленна как 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
еще один вариант, несколько быстрее, как мне кажется:
тут вообще нужен только один проход ![]() смотрим ан первую строку, она состоит из отрезков суши и воды по очереди каждый отдельный отрезок суши называем отстровом, даем ему номер, можно объект какой-нибудь для него создать - неважно переходим на следующую строку и смотрим... какие варианты могут быть: 1. остров тупо продолжается (в общем-то ничего особенного не делаем) 2. остров заканчивается (сохраняем его в массиве "готовых" островов) 3. два острова (или больше) объединяются (один удалить, другой оставить) 4. начинаестя новый (создать новый объект/выделить новый номер) -------------------- qqq |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
попробовал изобразить это в C++
предположение1:имеется класс CIsland с конструктором CIsland(int x,int y) предположение2:вехняя строчка и левый столбец - все в воде (просто для удобства) на вход дается массив, куда записываются найденные острова возвращается количество...
-------------------- qqq |
|||
|
||||
reddevil |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Да написано клево, вот только мне опыта не хватает это разобрать,
![]() P.S: От дополнительных коментариев по этому поводу не откажусь. |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 24 Всего: 110 |
просто код оказался короче, если предположить, что их нет впрочем, это не такое уж натянутое предположение - можно их добавить вручную иначе нужно будет обрабатывать специальным образом лувый столбец и первую строку - алгоритм не изменится, просто добавится несколько неинтересных строк...
для того, чтобы прочувствовать этот алгоритм, можно посоветовать вот что: 1. берем лист в клеточку 2. рисуем на нем какие-то острова 3. идем построчно слево направо, сверху вниз 4. пытаемся решить задачу используя только соседние клеточки 5. каждый участок сущи должен быть пронумерован 6. соединенные участки суши должны быть пронумерованы одинаковыми числами (по возможности) 7. если не получается (например, оказывается, что сверху один номер, а слева другой), пишем в клеточку любой из этих двух, а сбоку на листочке пишем что-то типа "5=9", т.е. острова 5 и 9 на самом деле один и тот же -------------------- qqq |
||||
|
|||||
reddevil |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Спасибо
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |