forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Обработка массива. (http://forum.boolean.name/showthread.php?t=8512)

Abiron 19.06.2009 20:58

Обработка массива.
 
Имеется масив к примеру:

Код:

001111110000
000111001100
000011100110
001111100110
001111111110

Подскажите, как можно определить замкнутые пространства в этом масиве?
Делаю не совсем стандартный хоникс. Нужно чтоб при ограничении пространства оно все закрашивалость(данный хоникс будет построен на масиве не для простоты а для самой идеи). Какие есть идеи? Я вообще не представляю как это можно реализовать(есть неконкретные догадки). Мне не нужен готовый код функции. Может у кого то есть сами идеи реализации? И кто может подкинуть туториал или пример по хониксам? Туториал можно и не под блиц. Спасибо за участие.

Illidan 19.06.2009 22:27

Re: Обработка массива.
 
Это тебе скорее всего алгоритм поиска пути надо юзать, точнее ту часть ,что определяет доступные зоны. Тут, на сайте, в разделе алгоритмики,кажется можно найти простенький пример.;)

MiXaeL 19.06.2009 22:38

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

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

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

Abiron 19.06.2009 22:48

Ответ: Обработка массива.
 
Illidan и Michael спс.

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

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

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

MiXaeL 19.06.2009 23:59

Ответ: Обработка массива.
 
Ну я примерно про это говорил (там к концу ближе)

Abiron 20.06.2009 01:02

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

Код:

001111110000

1кусок- 000111111100 -3кусок
________000011100110
________111111100111
________001111111110
2кусок- 000000000000

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

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot