2016-06-19 9 views
0

Если я случайно сгенерированный массив с 60 элементами (представлено в виде 6x10) 6 типов (представлено в виде целых чисел 0-5), как можно выполнять поиск групп тот же тип внутри массива? (по вертикали/горизонтали связные группы, по меньшей мере, 3)Нахождения групп в массиве одномерных сеток

я работаю в среде сценариев (LSL) похож на C++ и C.

+1

Использовать алгоритм заполнения заливки. – nemetroid

+0

То, что я теоретизировал в голове, как-то определяет начальную точку где-то вдоль массива, а затем начинает циклы в каждом «направлении», но это может быстро перерасти в десятки циклов с большими сетками, так как каждому подключенному типу понадобятся свои собственные петли. _ (Никакой фактический код не был написан мной еще в этом отделе, так как я нахожусь в убытке.) _ – F8bit

+1

LSL совсем не похож на C, который не является языком сценариев, LSL больше похож на Javascript - например, его обработка строк. –

ответ

0

Здесь параметризованным working Javascript пример с комментариями, трюк заключается в использовании массива для обозначения ячеек/узлов, которые вы уже посетили.

var arr = [], visited, grp, val, rowLength = 6, threshold = 3; 

// generate random array 
for (var i = 0; i < 60; i++) { 
    arr.push(Math.floor(Math.random() * 6)); 
} 

alert(JSON.stringify(findGroups())); // executing the function and displaying the result. 

function findGroups() { 
    visited = []; // resetting visited 
    var ret = []; // the return value is an array of groups 
    for (var i = 0; i < arr.length; i++) { 
    if (!visited[i]) { 
     val = arr[i]; // set the value we are currently inspecting 
     grp = []; // reset the current group 
     flood(i); // the recursive flood function 
     if (grp.length >= threshold) // add the group to the result if it meets the criteria 
     ret.push(grp); 
    } 
    } 
    return ret; 
} 

function flood(idx) { 
    if (visited[idx] || arr[idx] != val) // only look at cells with matching value... 
    return; // ... that weren't visited yet 
    visited[idx] = true; // mark as visited 
    grp.push(idx); // add index to current group 
    if (idx % rowLength != 0) // can go left 
    flood(idx - 1); 
    if (idx % rowLength != rowLength - 1) // can go right 
    flood(idx + 1); 
    if (idx >= rowLength) // can go up 
    flood(idx - rowLength); 
    if (idx < arr.length - rowLength) // can go down 
    flood(idx + rowLength); 
} 
+0

Благодарим вас за пример кода. С некоторыми изменениями в функциональности я смог успешно реализовать это, и я думаю, что я понял, как правильно использовать рекурсивные функции. – F8bit