Nie wiem czy to coś pomoże, ale rzeczywiście wyżej wspomniany algorytm FloodFill działa tu. Nie jest to na bitach ale przerobić zawsze idzie a tablice wyników nożna zoptymalizować, dziś mam leniwy dzień ale jak interesuje cię ta opcja to daj znak, przerobimy na bity i zoptymalizujemy.
#include<conio.h>
#include<stdio.h>
// Rozmiar tablicy
#define SZ_TAB 20
#define WY_TAB 10
// Czarne i biale w tablicy - przykladowe
char tab[WY_TAB][SZ_TAB]=
{{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1},
{0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,0,0},
{0,1,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1},
{0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1},
{0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,0,0,0},
{0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
// Tutaj znajda sie wyniki - szczyt nieoptymalizacji.. ;)
unsigned int wynik[SZ_TAB*WY_TAB];
// metoda FLOODFILL
int l=0;
int FloodFill (int x,int y)
{
// sprawdzenie przekroczenia zakresu obszaru
if (x >= 0 && x <= SZ_TAB && y >= 0 && y <= WY_TAB)
// sprawdzenie warunku rysowania
if (tab[y][x]==1)
{
// postawienie punktu
tab[y][x]=0;
l++;
// wywolania rekurencyjne
FloodFill (x,y-1);
FloodFill (x+1,y);
FloodFill (x,y+1);
FloodFill (x-1,y);
FloodFill (x-1,y-1);
FloodFill (x-1,y+1);
FloodFill (x+1,y-1);
FloodFill (x+1,y+1);
}
return l;
}
int main(void)
{
// Namaluje obrazek...
for (int y=0;y<WY_TAB;y++)
{
for (int x=0;x<SZ_TAB;x++)
{
if (tab[y][x]==0) printf("-");
if (tab[y][x]==1) printf("X");
}
printf("\n");
}
printf("\n");
// Powylicza klastry...
for (int y=0;y<WY_TAB;y++)
for (int x=0;x<SZ_TAB;x++)
if (tab[y][x]==1)
{
int p=FloodFill(x,y);
wynik[p]++;
l=0;
}
// Przedstawi wynik
for (int x=0;x<SZ_TAB*WY_TAB;x++)
if (wynik[x])
printf("Klastrow rozmiaru %d:%d\n",x,wynik[x]);
getch();
}