2016-06-19 6 views
0

Wenn ich einen zufällig erzeugte Array mit 60 Elementen (dargestellt als 6x10) von 6 Typen (als ganze Zahlen dargestellt 0-5), wie kann ich für Gruppen Suche von der gleiche Typ innerhalb des Arrays? (Vertically/horizontal verbundenen Gruppen von mindestens 3.)Finding Gruppen in einer eindimensionalen Gitteranordnung

Ich bin in einer Skriptumgebung (LSL) ähnlich wie C++ und C arbeiten

+1

Verwenden Sie einen Flood-Fill-Algorithmus. – nemetroid

+0

Was ich in meinem Kopf theoretisiert habe, ist irgendwie einen Startpunkt irgendwo entlang des Arrays zu bestimmen, dann beginnen Schleifen in jeder "Richtung", aber dies könnte schnell zu Dutzenden von Schleifen mit größeren Gittern eskalieren, da jeder verbundene Typ seine eigenen Schleifen benötigt. _ (Es wurde noch kein Code von mir in dieser Abteilung geschrieben, da ich nichts anfangen kann.) _ – F8bit

+1

LSL ist überhaupt nicht ähnlich zu C, das keine Skriptsprache ist, LSL ist dem Javascript ähnlicher - so wie es ist String-Handhabung. –

Antwort

0

Hier wird ein parametrisiert working JavaScript-Beispiel mit Kommentaren, die Trick besteht darin, ein Array zu verwenden, um die Zellen/Knoten zu bezeichnen, die Sie bereits besucht haben.

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

Vielen Dank für das Codebeispiel. Mit einigen Änderungen in der Funktionalität konnte ich dies erfolgreich implementieren, und ich denke, dass ich herausgefunden habe, wie man rekursive Funktionen richtig einsetzt. – F8bit