Ciao alterind, vedo che sei nottambulo!
Nell' esempio ho messo una matrice 10x10 contente un gruppo di tre elementi messo a elle (il 5), un gruppo di 4 elementi messo a quadrato (il 7) il resto è tutto a zero e forma un gruppo 93 elementi.
Un insieme di celle uguali è stato chiamato Gruppo e viene tenuto un array di gruppi, per cui alla fine puoi vedere quanti e quali gruppi ci sono e che dimensione hanno.
L' algoritmo è ricorsivo e per ogni cella cerca gli adiacenti uguali mettendo le loro coordinate (la struct Cell) in un array (la classe Group), ogni gruppo va a finire nell' array 'groups'.
#include <iostream>
#include <vector>
using namespace std;
struct Cell
{
int x;
int y;
Cell(int ax, int ay) { x = ax; y = ay; }
};
class Group: public vector<Cell>
{
};
class Raggruppateur
{
public:
static const int dimX = 10;
static const int dimY = 10;
int matrix[dimX][dimY];
int flags[dimX][dimY];
vector<Group> groups;
public:
Raggruppateur()
{
for(int x = 0; x < dimX; ++x)
for(int y = 0; y < dimY; ++y)
matrix[x][y] = flags[x][y] = 0;
}
void Raggruppation()
{
for(int x = 0; x < dimX; ++x)
for(int y = 0; y < dimY; ++y)
{
if (flags[x][y] == 0)
{
groups.push_back(Group());
Raggruppation(x, y, matrix[x][y]);
}
}
}
void Add(int x, int y)
{
flags[x][y] = 1;
groups.back().push_back(Cell(x, y));
}
void Raggruppation(int x, int y, int seed)
{
if ((x < 0) || (y < 0) || (x >= dimX) || (y >= dimY))
return;
if ((matrix[x][y] != seed) || (flags[x][y] != 0))
return;
Add(x, y);
Raggruppation(x - 1, y, seed);
Raggruppation(x + 1, y, seed);
Raggruppation(x, y - 1, seed);
Raggruppation(x, y + 1, seed);
}
};
int main (void)
{
Raggruppateur r;
r.matrix[1][3] = r.matrix[2][3] = r.matrix[2][4] = 5;
r.matrix[5][6] = r.matrix[6][6] = r.matrix[5][7] = r.matrix[6][7] = 7;
r.Raggruppation();
for (vector<Group>::iterator it = r.groups.begin(); it != r.groups.end(); ++it) {
Cell c = *it->begin();
int n = r.matrix[c.x][c.y];
cout << n << " - "<< it->size() << endl;
}
return 0;
}
La seconda matrice chiamata 'flags' serve per marcare quali celle sono già state raggruppate.
Troverai dei nomi un pò stupidi e le classi scritte rozzamente (è tutto pubblico e inline) è l' effetto del caldo boia che c' è stato ieri.
Comunque a te interessa solo l' algoritmo poi immagino organizzerai il codice diversamente.