2013-09-25 1 views
-1

У меня есть массив - 2D (100 х 100 в данном случае) с некоторыми государствами ограниченных пределах границ, как показано на картинке: http://tinypic.com/view.php?pic=mimiw5&s=5#.UkK8WIamiBIИсключение полей с определенным состоянием из 2D-массива; Игра жизни

Каждая ячейка имеет свой собственный идентификатор (цвет, например, зеленый цвет является идентификатор = 1) и флаг isBorder (отмечен как белый на pic, если true). То, что я пытаюсь сделать, - исключить набор ячеек с одним состоянием, ограниченным границами (Grain), чтобы я мог работать на каждом зерне отдельно, что означает, что мне нужно будет хранить все индексы для каждого зерна.

У кого-нибудь есть идея, как его решить?

ответ

1

Теперь, когда я снова прочитал ваш вопрос ... Алгоритм по существу тот же, что и заполнение сплошной области цветом. Наиболее распространенный способ сделать это - алгоритм BFS.

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


// Редактировать: куча других идей, сделанных до того, как я понял вопрос.

Я могу себе представить алгоритм работает так:

vector<2dCoord> result = data.filter(DataType::Green); 
for (2dCoord in result) { 
    // do some operations on data[2dCoord] 
} 

Реализация filter в простой неоптимизированном образом будет сканировать весь массив и push_back соответствующих полей в вектор.

Если потребуется более сложные запросы, лениво-оцениваемые объекты прокси могут работать чудеса:

data.filter(DataType::Green) 
    .filter_having_neighbours(DataType::Red) 
    .closest(/*first*/ 100, /*from*/ 2dCoord(x,y)) 
    .apply([](DataField& field) { 
     // processing here 
    });