J'ai besoin d'écrire une fonction récursive en C ++ qui trouve la plus grande surface de numéro '1' dans une matrice 2D contenant seulement 1 ou 0.
Exemple: P>
int Arr[5][8] = { { 0, 0, 0, 0, 1, 1, 0, 0, }, { 1, 0, 0, 1, 1, 1, 0, 0, }, { 1, 1, 0, 1, 0, 1, 1, 0, }, { 0, 0, 0, 1, 1, 1, 1, 0, }, { 0, 1, 1, 0, 0, 0, 0, 0, }, };
4 Réponses :
Je pensais faire cela avec quelque chose de similaire à l'algorithme de remplissage d'inondation p>
Je pense que c'est un très bon moyen de le faire. Appliquez le remplissage des inondations à tout
1 code>, en comptant ceux et les remplaçant avec des zéros. P>
répéter jusqu'à ce que la grille soit entièrement composée de zéros. P>
Ce qui suit sera imprimé sur les tailles des composants connectés sans ordre particulier: p>
xxx pré> blockQuote>
Je ne sais pas comment vous voulez faire cela, mais vous devez faire attention si vous remplacez le 1 code> S avec
0 code>'s. Sinon, vous pourriez couper une surface connectée en deux et ne reconnaissez plus qu'ils appartenaient ensemble au début.
quelque chose comme,
BTW: OP demandait une solution récursive, afin que les inondations se remplissent et se retrouvent ensemble devraient fonctionner
approche rapide, mais je ne sais pas s'il y a un moyen de le faire de manière saine (récursif L'appel à chaque élément n'éduit pas pour C ++ car la pile d'appel est limitée)
int maxy = 5 int maxx = 8 int areasize(int x, int y) { if (x < 0 || y < 0 || x > maxx || y > maxy || !Arr[y][x]) return 0; Arr[y][x] = 0; return 1 + areasize(x + 1, y) + areasize(x - 1, y) + areasize(x, y + 1) + areasize(x, y - 1); } maxarea = 0; for (int y = 0; y < maxy; y++) { for (int x = 0; x < maxx; x++) { maxarea = std::max(maxarea, areasize(x, y)); } }
Merci pour l'indice, j'ai oublié d'insérer la déclaration d'effacement.
bool visited[5][8]; int i,j; // variables for the area: int current_area = 0, max_area = 0; int Arr[5][8]={ // type your map of values here } // functions void prepare_visited_map() { for(i=0;i<5;i++) { for(j=0;j<8;j++) visited[i][j] = false; } } // recursive function to calculate the area around (x,y) void calculate_largest_area(int x, int y) { if(visited[x][y]) return; // check if out of boundaries if(x<0 || y<0 || x>=5 || y>=8) return; // check if the cell is 0 if(!Arr[x][y]) { visited[x][y] = true; return; } // found a propper cell, proceed current_area++; visited[x][y] = true; // call recursive function for the adjacent cells (north, east, south, west) calculate_largest_area(x,y-1); calculate_largest_area(x+1,y); calculate_largest_area(x,y+1); calculate_largest_area(x-1,y); // by the end of the recursion current_area will hold the area around the initial cell } // main procedure where the above functions are used int mian() { // calculate the sorrounding area of each cell, and pick up the largest of all results for(i=0;i<5;i++) { for(j=0;j<8;j++) { prepare_visited_map(); calculate_largest_area(i,j); if(current_area > max_area) max_area = current_area; } } printf("Max area is %d",max_area"); } Hope this was helpful :)
Le remplissage des inondations fonctionnerait. Si vous êtes coincé quelque part, vous devriez poster votre tentative et décrire votre problème.
Peut-être que pour chaque élément qui équivaut à 1 vérifiez vers le nord, le sud-est et l'ouest puis une augmentation et vérifiez à nouveau. En outre, ajoutez des indices de réseau incrémentés à une liste ignorée. Il y a tellement d'algorithmes de remplissage d'inondations qu'il serait intéressant de savoir quel est le meilleur.
une question connexe est Stackoverflow.com/questions/2478447/...