#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int cevreyikontrolet(int matris[][10],int i,int j);
void cevreyiisaretle(int matris[][10],int i,int j);
int main()
{
int matris[10][10],sayici=0,i,j;//sayici:grup sayısını eksili olarak sayacak
srand(time(NULL));
for(i=0;i<10;i++)
for(j=0;j<10;j++)
matris[i][j]=rand()%2;
//matrisi yazdırma
printf("Matris:\n");
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%3d",matris[i][j]);
}
printf("\n");
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(matris[i][j]==1)
if(cevreyikontrolet(matris,i,j)==1)
{
sayici--;
matris[i][j]=sayici;//kaçıncı grup olduğunu eksilisi ile 1 i değiştir.
cevreyiisaretle(matris,i,j);
}
//matrisin çevresinde kaçıcı grup olduğunu belirten sayi varsa(sayici)
else if(cevreyikontrolet(matris,i,j)<0)
{
matris[i][j]=cevreyikontrolet(matris,i,j);
cevreyiisaretle(matris,i,j);
}
//matrisi grup numaralarına göre yazdırma(-1 olanlar tekli bulunanlar)
printf("\nGrup numaralarina gore:\n\n");
for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%3d",(-1)*matris[i][j]);
}
printf("\n");
}
printf("%d adet grup bulunmakta\n",-sayici);
}
int cevreyikontrolet(int matris[][10],int i,int j)
{
int deger1=0,deger2=0;
if(j+1<10)//sağındaki değer
if(matris[i][j+1]!=0)
{
deger1=matris[i][j+1];
if(deger1<0)
return deger1;
}
if(j-1>=0)//solundaki değer
if(matris[i][j-1]!=0)
{
deger1=matris[i][j-1];
if(deger1<0)
return deger1;
}
if(i-1>=0)//üstündeki değer
if(matris[i-1][j]!=0)
{
deger1=matris[i-1][j];
if(deger1<0)
return deger1;
}
if(i+1<10)//altındaki değer
if(matris[i+1][j]!=0)
{
deger1=matris[i+1][j];
if(deger1<0)
return deger1;
}
//çapraz değerler
if(i+1<10&&j+1<10)
if(matris[i+1][j+1]!=0)
{
deger1=matris[i+1][j+1];
if(deger1<0)
return deger1;
}
if(i+1<10&&j-1>=0)
if(matris[i+1][j-1]!=0)
{
deger1=matris[i+1][j-1];
if(deger1<0)
return deger1;
}
if(i-1>=0&&j-1>=0)
if(matris[i-1][j-1]!=0)
{
deger1=matris[i-1][j-1];
if(deger1<0)
return deger1;
}
if(i-1>=0&&j+1<10)
if(matris[i-1][j+1]!=0)
{
deger1=matris[i-1][j+1];
if(deger1<0)
return deger1;
}
//hiçbir return çalışmamışsa
return deger1;
}
//çevredeki tüm 1 olan değerleri ve onların çevrelerini grup numarasının eksilisi ile değiştiriyor.
void cevreyiisaretle(int matris[][10],int i,int j)
{
if(matris[i][j]<0)
{
if(j+1<10)//sağındaki değer
if(matris[i][j+1]==1)
{
matris[i][j+1]=matris[i][j];
cevreyiisaretle(matris,i,j+1);//recursion:kendini çağırma
/*1 olanların çevresinde 1 olmayana kadar çevresini grup numarası ile işaretleme*/
}
if(j-1>=0)//solundaki değer
if(matris[i][j-1]==1)
{
matris[i][j-1]=matris[i][j];
cevreyiisaretle(matris,i,j-1);
}
if(i-1>=0)//üstündeki değer
if(matris[i-1][j]==1)
{
matris[i-1][j]=matris[i][j];
cevreyiisaretle(matris,i-1,j);
}
if(i+1<10)//altındaki değer
if(matris[i+1][j]==1)
{
matris[i+1][j]=matris[i][j];
cevreyiisaretle(matris,i+1,j);
}
//çapraz değerler
if(i+1<10&&j+1<10)
if(matris[i+1][j+1]==1)
{
matris[i+1][j+1]=matris[i][j];
cevreyiisaretle(matris,i+1,j+1);
}
if(i+1<10&&j-1>=0)
if(matris[i+1][j-1]==1)
{
matris[i+1][j-1]=matris[i][j];
cevreyiisaretle(matris,i+1,j-1);
}
if(i-1>=0&&j-1>=0)
if(matris[i-1][j-1]==1)
{
matris[i-1][j-1]=matris[i][j];
cevreyiisaretle(matris,i-1,j-1);
}
if(i-1>=0&&j+1<10)
if(matris[i-1][j+1]==1)
{
matris[i-1][j+1]=matris[i][j];
cevreyiisaretle(matris,i-1,j+1);
}
}
}