İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Sinema Dizi Akıllı Ev Motosiklet Mikromobilite Kripto Para Sağlık Teknolojileri Son dakika Yazarlar
  1. Ana sayfa
  2. SDN Forum
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

C de matris sorusu acill yardım

Konu bilgisi

3cevap
3.057görüntüleme
05.2014açıldı
04.05.2014son cevap

#1
arkadaşlar merhaba
10x10 luk bir matriste rastgele yerlere 1'ler ve 0'lar atanıyor.

Yukarıdaki resimde göründüğü gibi bir matris elde ediyorum.Siyah renkli 1ler bir grup oluşturuyor ve benimde bu grupların sayısını bulmam lazım.Resimde 3 tane grup gözüküyor.
Fakat ben bir türlü bulamıyorum yardımcı olurmusunuz.Sizden kod filan istemiyorum sadece bir yol göstermenizi istiyorum .Hiç bir yol bulamadım nasıl yapabileceğim hakkında.
Cevaplar
#2

#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);
    }
    
    }
}
last_patasana Konuyu açan
#3
lightning01 ellerine sağlık.Fakat koddaki cevreyikontrolet fonksiyonunda

if(deger1<0)
return deger1;
kısmında hiçbir değer 0'dan küçük gelmiyor orayı anlayamadım.
#4
last_patasana dedi: ↑
lightning01 ellerine sağlık.Fakat koddaki cevreyikontrolet fonksiyonunda

if(deger1<0)
return deger1;
kısmında hiçbir değer 0'dan küçük gelmiyor orayı anlayamadım.
program 1 leri grup numarasının eksilisi ile değiştiriyor.mesela 2. grup ta ise 1 i -2 ile değiştiriyor.çevreyikontrolet fonksiyonu çevresinde grup numarası varsa (eksili değer) grup numarasını, sadece 1 ler varsa 1 i döndürüyor.1 in çevresinde sadece 1 varsa numarası verilmemiş yeni bir grupla karşılaşıldığı için main in içinde sayici bir azaltılarak kontrol edilen 1(matris[j]) ve çevresi grup numarasıyla işaretleniyor.(deger1: çevreden gelen deger; eğer 0 dan küçükse yani çevrede grup numarası varsa grup numarasını döndür anlamında)

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.

Reklam