Thread overview
Benzersiz İki Boyutlu Matris
Nov 06, 2015
agora
Nov 06, 2015
agora
Nov 08, 2015
agora
Nov 08, 2015
agora
November 06, 2015

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 06, 2015

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 06, 2015

Çözümü bilmiyorum ama j'yi 1'den başlattığında bazı elemanlara hiç dokunmamış ve onları hiç yazdırmamış oluyorsun.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 08, 2015

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 08, 2015

Ö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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 08, 2015

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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 08, 2015

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 08, 2015

Alıntı (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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]