Forum: Diğer Konular RSS
Benzersiz İki Boyutlu Matris
agora #1
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Benzersiz İki Boyutlu Matris
Merhaba. Elimde bir çift boyutlu matris var. Her satır ve kolon benzersiz sıralama üretmeli. Çıktı olarak şöyle olmasını umarak(sadece umdum) kodladım:

2 hata gözlemledim.

İlk hata umduğum çıktı gelmiyor. Hatta örneğin 5'ten büyük bir değer girersem taşma yaşıyor 32 bin gibi sayılar veriyor.

İkinci hata aşağıdaki ilk 3 satır gibi bir çıktı vermek yerine

1 2 3
2 3 4
3 4 5 formatında çıktı veriyor.

Nasıl bir işlem ve mantık hatasına sahibim? Mantığını pek kavrayamamış gibiyim sanırım. Kodlar aşağıda.

Olması gereken(yıldızlı noktalar benzersizliği devam ettiren birer rakam aslında :)):

1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 * * * * * *    4
6 * * * * * *     3
7  * * * * * *    2
8 7 8 5 4 3 2 1

Şöyle bir kodum var.

#include <stdio.h>
 
int main()
{
  int boyut;
  printf("Boyut: ");
  scanf("%d", &boyut);
 
  /*for(int i = 1; i <= boyut; i++)
  {
    for(int j = 1; j <= boyut; j++)
    {
      printf("%d", j);
    }
    printf("\n");
  }*/
 
  int a[boyut][boyut];
 
  for(int i = 0;i<boyut;i++){
   for(int j = 1;j<boyut;j++){
      a[i][j]=i+j;
   }
  }
 
  for(int i = 0;i<boyut;i++){
   for(int j = 1;j<boyut;j++){
      printf("%d ",a[i][j]);
   }
   printf("\n");
  }
 
}

Düzenleme

Şöyle deniyorum hiç yazdıramıyorum bile:

int a[boyut][boyut];
 
  for (int n = 0; n < boyut; n+=n) {
    for (int i = 0; i < boyut; i++) {
      for (size_t j = 0; j < boyut; j++) {
        a[i+n][j] = a[i][j];
        a[i][j+n] = a[i][j];
        a[i+n][j+n] = !a[i][j];
      }
    }
  }
 
  for (int i = 0; i < boyut; i++) {
    for (int j = 0; j < boyut; j++) {
      if (/* condition */) {
        /* code */
      }
    }
  }
Bu mesaj agora tarafından değiştirildi; zaman: 2015-11-06, 12:34.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çözümü bilmiyorum ama j'yi 1'den başlattığında bazı elemanlara hiç dokunmamış ve onları hiç yazdırmamış oluyorsun.

Ali
agora #3
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Düzenleyince çıktı şöyle oluyor hocam:

Boyut: 4
0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6

Bunu ne olarak araştırmalıyım onu da bilemiyorum.

Tek fark ettiğim sağ üst sol alt ile, sol üst sağ alt ile örtüşüyor. Kafamda mantığını türetebilsem sorun kalmayacak gibi.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Özyinelemeli bir algoritma buldum ama sanırım N'nin 2'nin katı olması gerekiyor.

N==1 olduğunda tek 0 rakamı var ve matrisin çözümü basit:


0


N==2 olduğunda alfabemizde 0 ve 1 rakamları var. Algoritma şu:

1) Alfabeyi iki parçaya ayır (2'nin katı olması gerekliliği bu yüzden)
2) N/2 çözümünü her iki yarıya uygula (Bu durumda iki sonuç var: 0 ve 1)
3) Elde edilen iki sonucu iki satıra yer değiştirerek yerleştir: Önce 0,1 ve sonra 1,0. Böylece 4 elemanlı matris oluyor:

01
10


Şimdi N==4 durumuna bakalım. Alfabede 0, 1, 2, ve 3 vardır:

1) İki parçaya ayırınca bir parçada 0 ve 1, diğerinde 2 ve 3 kalır
2) N/2=2 çözümünü 0 ve 1 ile 2 ve 3'e ayrı ayrı uygulayınca şu matrisler çıkıyor:

01        23
10   ve   32

3) Şimdi o iki sonucu iki satıra yer değiştirerek yerleştirelim:

ilk satır:    01 23
              10 32

ikinci satır: 23 01
              32 10


N==8'durumuna bakıldığında zaten alfabenin ilk yarısı yukarda var. Aynısını ikinci yarıya uygulasak o da şöyle olur

45 67
54 76

67 45
76 54


Şimdi 0123'ten elde edilen matrisle 4567'den elde edileni yine iki satır halinde ve yer değiştirerek yerleştiriyoruz:

0123 4567
1032 5476
2301 6745
3210 7654

4567 0123
5476 1032
6745 2301
7654 3210


Galiba oluyor ama bu yöntem gerçekten üstün mü? Bir de tabii kodlamak gerek. :)

Ali
agora #5
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Belirli bir yere kadar sıkıntı yok aslında.

4x4 matriste tamam ama 8x8 girersem pascal üçgeni gibi çıktı vermeye başlıyor. Taşma olabilir. Sanırım calloc uygulanmalıymış. Bundan da emin değilim aslında.

Bu matrisler hadamard olarak da geçmekteymiş. Ancak hadamard matrisin böylesine denk gelmedim henüz.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Buna biraz daha dikkatlice bakınca basit bir biçimde iki indeksin ya da'lanması (XOR) olduğunu gördüm. Galiba doğru:
import std.stdio;
 
void main() {
    enum N = 8;
 
    foreach (i; 0 .. N) {
        foreach (j; 0 .. N) {
            write(i ^ j);
        }
        writeln();
    }
}
01234567
10325476
23016745
32107654
45670123
54761032
67452301
76543210

Hem de hiç yer ayırmaya gerek yok. İki indeks verildiğinde elemanı hemen bilebiliyoruz: i ^ j. :)

Ali
agora #7
Üye Tem 2013 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu kadar kolay görüneceğini tahmin etmemiştim aslında. En azından o kadar uğraştım keşke daha zor olsaydı :( çok teşekkür ederim üstad yardımın için.

Sadece fark ettiğim 1 ile başlarsa taşma sıkıntısı devam ediyor bunun sebebi nedir?

Dizinin 0 ile başlaması olayı mı?
Bu mesaj agora tarafından değiştirildi; zaman: 2015-11-08, 21:42.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
agora:
Dizinin 0 ile başlaması olayı mı?

Evet. j'yi 1'den başlatan program dizinin bazı elemanlarına hiç değer atamıyordu. Öyle olduğunda elemanların rasgele değerleri olur. Taşma dediğin sanırım onunla ilgili.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 19:29:38 (UTC -08:00)