Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 19.06.2009, 20:58   #1
Abiron
ПроЭктировщик
 
Регистрация: 30.12.2008
Сообщений: 164
Написано 18 полезных сообщений
(для 23 пользователей)
Плохо Обработка массива.

Имеется масив к примеру:

001111110000
000111001100
000011100110
001111100110
001111111110
Подскажите, как можно определить замкнутые пространства в этом масиве?
Делаю не совсем стандартный хоникс. Нужно чтоб при ограничении пространства оно все закрашивалость(данный хоникс будет построен на масиве не для простоты а для самой идеи). Какие есть идеи? Я вообще не представляю как это можно реализовать(есть неконкретные догадки). Мне не нужен готовый код функции. Может у кого то есть сами идеи реализации? И кто может подкинуть туториал или пример по хониксам? Туториал можно и не под блиц. Спасибо за участие.
(Offline)
 
Ответить с цитированием
Старый 19.06.2009, 22:27   #2
Illidan
Разработчик
 
Регистрация: 06.08.2007
Сообщений: 473
Написано 131 полезных сообщений
(для 257 пользователей)
Re: Обработка массива.

Это тебе скорее всего алгоритм поиска пути надо юзать, точнее ту часть ,что определяет доступные зоны. Тут, на сайте, в разделе алгоритмики,кажется можно найти простенький пример.
(Offline)
 
Ответить с цитированием
Старый 19.06.2009, 22:38   #3
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Обработка массива.

Рекурсия.
Заводишь переменную под текущий цвет. Пусть для простоты это x=2.
Перебираешь все клетки. Из клетки, если она уже не покрашена, идешь во всех 4 направлениях, если она 0 - закрашиваешь, если "1" (граница) или любое другое число, отличное от нуля (уже закрашена) - не идешь в нее, рассматриваешь другое направление. Естественно, надо как-то отмечать уже закрашенные клетки (ставить в них "2").
Вот только при таком способе будут закрашивать все участки, т.к. конец массива тоже должен считаться границей. Но можно сделать так: если вдруг при следующем ходе мы дошли до границы массива, то запустить из этой клетки обратное покрашивание (например, в черный цвет, т.е. например x=3). И не забыть отмечать эти клетки, как покрашенные (теперь уже "3"). Таким образом отсечется все это пространство, ограниченное нашими "1" и концами массива, т.к. уже покрашенные клетки пропускаются при переборе.

в итоге получится:
331111113333
333111221133
333311122113
331111122113
331111111113

Все "3" - открытые области. Все "2" - замкнутые пространства.

Последний раз редактировалось MiXaeL, 20.06.2009 в 00:16. Причина: дополнения
(Offline)
 
Ответить с цитированием
Старый 19.06.2009, 22:48   #4
Abiron
ПроЭктировщик
 
Регистрация: 30.12.2008
Сообщений: 164
Написано 18 полезных сообщений
(для 23 пользователей)
Ответ: Обработка массива.

Illidan и Michael спс.

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

Кстати модеры-не могли бы вы перенести эту тему в алгоритмы, а то её и впрям место там т.к. нужен не код а алгоритм.

П.С. Не понял-верно ли Michael понял мою идею .Но сам из его поста ничего не понял. Всеравно спс.

Последний раз редактировалось Abiron, 19.06.2009 в 23:04.
(Offline)
 
Ответить с цитированием
Старый 19.06.2009, 23:59   #5
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений
(для 267 пользователей)
Ответ: Обработка массива.

Ну я примерно про это говорил (там к концу ближе)
(Offline)
 
Ответить с цитированием
Старый 20.06.2009, 01:02   #6
Abiron
ПроЭктировщик
 
Регистрация: 30.12.2008
Сообщений: 164
Написано 18 полезных сообщений
(для 23 пользователей)
Ответ: Обработка массива.

Теперь понял о чем ты говоришь. Спасибо за помощь. Я так и хотел сделать. Сейчас разберусь с тем маном, что ты подкинул. Может там еще чтонить полезное есть. По мере написания поста родилась оригинальная мысль:
Не парится с заливкой 2 т.к. это надо делать от каждого элемента пути, что долго. Можно просто разделить края на отрезки, чтоб по краям были ограничители, тоесть:

001111110000

1кусок- 000111111100 -3кусок
________000011100110
________111111100111
________001111111110
2кусок- 000000000000
Тоесть получается что если закрашавать от одной из точек каждого куска, то точно закрасим все.

Тоесть сократим к минимуму количество лишних операций при закраске крайних кусков. А все что не закрашено будет внутреним и ограниченым сторонами из единичек со всех сторон. Тоесть идем от обратного. Есть только одна загвоздка-курсор может разнвми цветами закрашивать в зависимости от квадратика от которого он отошел. Можно ли считать, что Закрытая полость при таком методе образуется только если курсор пройдет по краю? Это учитывая что есть "монстры" разрушающие кубики переводя их из 1 в 0? Но строящих нету.Вроде должно. Интересно чье нибудь мнение?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка клавиатуры. GRAY_WOLF BugTracker 1 11.10.2009 22:00
Поворот массива точек SBJoker Алгоритмика 18 10.10.2008 14:48
Размер массива kyb66 Основной форум 7 15.12.2007 21:32
Обработка WM_CLOSE impersonalis Blitz3D 5 13.08.2007 19:54
Вопрос насчет массива и GUI Manfred 2D-программирование 10 22.12.2006 01:41


Часовой пояс GMT +4, время: 13:00.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com