Yazan: Şadi Evren ŞEKER

Bu yazının amacı, bir C sorusunun çözümünü açıklamaktır. Sorumuz basitçe n x n boyutlarındaki bir matrisin (soruyu basitleştirmek için n sayısını tek sayı olarak kabul edeceğiz) içerisine aşağıdakine benzer şekilde ardışık sayıları sarmal olarak yerleştirmek.

Örnek 3×3 boyutlarındaki matris:

1

2

3

8

9

4

7

6

5

5×5 boyutlarındaki örnek matris:

1

2

3

4

5

16

17

18

19

6

15

24

25

20

7

14

23

22

21

8

13

12

11

10

9

7×7 boyutlarındaki örnek matris:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

Yukarıdaki matrislere bakıldığında, sayısal olarak bazı özellikler bulunabilir. Bizim amacımız yukarıdaki problemi, 2 boyutlu problemden tek boyutlu probleme indirgemektir. Bunun sebebi diziler üzerinde işleme yapan en önemli enstrümanımız olan döngülerin tek boyutlu olarak çalışmasıdır. Burada iç içe yazılan iki döngünün iki boyutlu çalıştığı iddia edilebilir ancak bu durumda bile aslında yapılan iş, tek boyutlu bir taramanın, ikinci döngü ile (dıştaki döngü ile) tekrarlanmasıdır. Yani döngüler, yetenek olarak tek boyutlu, doğrusal hareket sağlar.

Bu tespitten sonra yukarıdaki problemi çözmek için sayısal özellikler bulmaya ve problemi tek boyutlu problem haline getirmeye çalışıyoruz.

İlk tespitimiz, 2 boyutlu bir matris içerisine ardışık sayıları yerleştirmek dolayısıyla matrisin ortasındaki sayının, matris boyutunun karesi olacağını biliyoruz. Örneğin 7×7 boyutlarındaki matris için ortada 49 , veya 5×5 boyutlarındaki matris için ortadaki değerin 25 olması gibi.

Ayrıca ortaya kadar olan köşegenleri bulursak tek boyutlu seriler oluşturmuş oluruz.

Örneğin aşağıdaki renklendirilmiş değerlerden başlayan ve sağa doğru giden tek boyutlu seriler, 1’er 1’er artan değerlerdir:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

Bu değerlerden başlayarak sağa doğru giden seri aşağıdaki şekilde işaretlenebilir:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

Amacımız, bu seriyi veren ve yukarıdaki şekilde, kırmızı renkle işaretlenmiş seri başlarını veren formülü bulmak.

Serimizde bulunan sayılar:

1, 25, 41, 49

Bu sayıların arasında bir bağlantı bulmamız gerekiyor. Sayıları tersten yazar ve aralarındaki farkları bulursak:

49, 41, 25, 1 ve aralarındaki farklar : 8 , 16, 24 şeklinde giden seridir. Bu serinin özelliği 8’in katları olmasıdır.

Benzer durum diğer boyutlardaki matrisler için de geçerlidir. Örneğin matris 9×9 boyutlarında olsaydı:

81, 73, 57, 33, 1 ve aralarındaki farklar: 8, 16, 24, 32 şeklinde olacaktı.

Benzer şekilde diğer köşegen değerlerini de bulalım:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

 

Mavi renkle işaretli köşegen değerlerini veren formülü inceleyelim :

19, 37, 47, 49 , bu sayıları ters sıralarsak : 49, 47, 37, 19 ve aralarındaki farklar: 2, 10, 18 şeklinde ilerlemektedir. Bu sayılar arasındaki fark da dikkat edilirse 8 ‘dir.

Benzer şekilde matris boyutu 9×9 olsaydı, 81, 79, 69, 51, 25, ve aralarındaki farklar: 2, 10, 18, 26 şeklinde olacaktı. Bu sayılardan başlayarak ilerleyen tek boyutlu dizilerimiz aşağıdaki şekilde olacaktı:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

Son serimiz aşağıda işaretlenen seridir:

1

2

3

4

5

6

7

24

25

26

27

28

29

8

23

40

41

42

43

30

9

22

39

48

49

44

31

10

21

38

47

46

45

32

11

20

37

36

35

34

33

12

19

18

17

16

15

14

13

Serimiz: 49, 45, 33, 13 şeklinde ilerlemektedir ve farklar: 4, 12, 20 şeklinde ilerlemektedir.

Şimdi, yukarıda incelediğimiz bu 4 durum için döngüleri yazmaya başlayalım. İlk durum için kodumuz aşağıdaki şekilde olur:

    int kat = 0;

    int fark = 0;

    for(int i = n/2 ;i>=0;i–){

        a[i][i] = n*n-fark;

        kat++;

        fark = fark + kat*8;

            for(int j = i+1;j<n-i;j++){

                a[i][j]=a[i][j-1]+1;

 

            }

    }

 

Yukarıdaki kodda, dikkat edilirse, bir fark değişkeni, sürekli olarak n*n değerinden çıkarılıyor. Buradaki değer a dizisinin [i][i] adresine yerleştiriliyor. Bu değer normalde, dizinin köşegen değeridir. Bu döngüdeki i değişkeni n/2 değerine kadar ilerlemektedir, dolayısıyla köşegenin yarısına kadar ilerleyen döngü, tam olarak 2 boyutlu dizinin ortasında bitmektedir.

Hesaplanan köşegen değerlerinden başlanarak, satırları dolduran döngü ise içerde yer almaktadır. Burada basitçe, hesaplanan her köşegen değerinden başlayarak satır değerlerini dolduran döngü yazılmıştır.

İkinci döngümüz aşağıdadır:


for(int i = n/2 ;i>0;i–){

         for(int j = i;j<n-i+1;j++){

                a[j][n-i]=a[j-1][n-i]+1;

 

            }

    }

 

Bu döngü, bir öncekine göre oldukça basittir çünkü önceki döngüde hesaplanan köşegen değerlerini devam ettirmektedir. Kısacası yeniden köşegen değeri hesaplanmadığı için, mevcut değerler üzerinden işlem yapılmakta ve tek boyutlu hareket tekrarlanmaktadır.

Üçüncü olarak alt satırları yazan döngümüzü kodlayalım:

    kat = 2;

    fark = 0;

 

    for(int i = n/2 ;i>0;i–){

        fark = fark +kat;

        a[n-i][i-1] = n*n-fark;

        

        

        kat = kat+8;

        

            for(int j = i;j<n-i+1;j++){

                a[n-i][j]=a[n-i][j-1]-1;

 

            }

    }

 

Hatırlanacağı üzer bu döngü, 2 den başlayarak 8’er 8’er artan döngüydü. Dolayısıyla kat değişkenini bu sefer 2 den başlatıp, ters köşegeni dönen döngüyü yazıyoruz. İçerideki döngümüz, sütun değerlerini yukarıdan aşağıya doğru dolduruyor. Burada ters köşegen için i+j=n formülünü hatırlayalım. Dolayısıyla a[j-i][j] değeri ters köşegeni vermektedir.

Son olarak ortanın solundaki kolonları dolduran döngülerimizi yazıyoruz:

 

    for(int i = 0 ;i<n/2;i++){

            for(int j = i+2;j<n-i;j++){

                a[n-j ][i]=a[n-j+1][i]+1;

            }

    }

 

Bu son döngü yapısında, dış döngümüz, köşegen yarısına kadar ilerlerken, içerideki döngümüz sütunları doldurmaktadır. Bu döngüyü yukarıda yazılan ikinci döngünün (ortanın sağındaki değerleri dolduran döngünün) tersi olarak düşünmek mümkündür. Bu dördüncü döngü için de başlangıç değerleri zaten hesaplanmıştır.

Kodun örnek çıktıları aşağıda verilmiştir:

7×7 boyutları için :

9×9 boyutları için:

Kodun tamamını indirmek için tıklayınız

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir