Sihirli Kare – C & kullanarak 3×3 Bulmacayı çözün Python Örnekler
Sihirli Kare nedir?
Sihirli kare, özel bir sayı düzenlemesine sahip kare bir matristir. Bu sayılar, her köşegen, satır ve sütundaki sayıların toplamı aynı kalacak şekilde düzenlenir. Sihirli kare oyunları, eğlence amaçlı matematikte kullanılan basit mantık bulmacalarıdır.
Sihirli karelere örnek:
Yukarıdaki şemada 3. dereceden sihirli kare örneği verilmiştir. Her köşegenin, satırın ve sütunun toplamı 15'tir.
Sihirli Kare nasıl çalışır?
Sihirli kareler, n^2 pozitif tam sayıdan oluşan n*n matrislerdir. Bir kare matrisin satır veya sütun sayısına matrisin sırası denir.
Tipik olarak, sihirli kareler bulmacaları tek sıralıdır ve 1'den n^2'ye kadar tam sayılar taşır. Her köşegenin, satırın ve sütunun toplamı aynıdır. Bu sayıya sihirli toplam veya sihirli sabit denir. Genellikle, bu sihirli toplam matrisin sırasına bağlıdır. n sırasındaki sihirli toplam için sihirli kareler formülü şudur:
Tamsayıları 3 olan sihirli kare örneğini ele alalım. Yani sihirli toplam şöyle olur:
Neden onlara Büyü deniyor?
Antik matematikçiler sayıların çeşitli ilginç kombinasyonlarının doğasından büyülenmişlerdi. Sihirli kare bunlardan biriydi. Sihirli karelerin en eski kanıtı MÖ 190'da Çin'e dayanır.
Bazı çalışmalar, antik Japonya, Hindistan ve Arabistan'da Sihirli kareler bulmacasına dair kanıtlar göstermektedir. Bazı efsanelere dayanarak, sayıların bu özel oluşumlarının büyülü dünyayla bağlantılı olduğu varsayılmıştır. Bu nedenle, bu karelere sihirli kareler adı verilmiştir.
Sihirli Kare Türleri
Sihirli kareler matematiğinin farklı çeşitleri vardır –
- Normal Sihirli Kare: Bu tür sihirli kareler ilk n^2 sayısını içerir.
- Yarı Sihirli Kare: Bu türde yalnızca satırlar ve sütunların toplamı sihirli sabiti verir.
- Basit Sihirli Kare: Önceki türün aksine, satırlar, sütunlar ve her iki köşegen sihirli sabiti toplar.
- En Mükemmel Sihirli Kare: Bu, iki özel özelliği olan normal bir sihirli karedir. Burada, matrisin her 2x2 alt karesi 2(n^2+1) toplamına ulaşır. Ve ızgaradan n/2 kare uzaklıkta olan herhangi bir sayı çifti n^2+1 toplamına ulaşır.
Özelliklere dayanarak, çok daha fazla sihirli kare türü vardır. Ancak, sadece sihirli kareden bahsettiğimizde, bunun tek sıralı normal ve basit bir sihirli kare olduğunu varsayarız.
Sihirli Kare Oluşturma Algoritması
Tek sıralı sihirli kareler üretme algoritması:
- İlk sayı veya 1, (n/2, n-1) konumunda depolanacaktır; burada ilk koordinat satır konumudur ve ikinci koordinat sütun konumudur. Daha sonraki adımlar için bu konumu (x, y) olarak gösterelim.
- Sonraki sayılar (x-1, y+1) konumunda saklanacaktır. Eğer konum geçerli değilse, o zaman aşağıdaki koşulları göz önünde bulunduracağız.
- Satır konumu -1 ise n-1'e çarpılacaktır. Benzer şekilde, hesaplanan sütun konumu n ise 0'a çarpacaktır.
- Hesaplanan konum zaten bir sayı içeriyorsa satır konumu 1 artırılır ve sütun konumu 2 azaltılır.
- Satır konumu -1 ve karşılık gelen sütun konumu n ise yeni konum (0, n-2) olacaktır.
Not: Bu algoritma yalnızca tek sıralı geçerli sihirli kareler üretir. Ayrıca bu sihirli kareyi ilk n^2 sayıya sahip normal bir sihirli kare olarak da değerlendiririz. Dahası, aynı n değeri için birden fazla çözüm olabilir.
Bir örnek alalım ve nasıl çalıştığını görelim. Diyelim ki 3. mertebeden sihirli kareyi bulmak istiyoruz. Tek mertebeden basit ve normal bir sihirli kare olacağı için 1'den 3^2'ye veya 9'a kadar tüm sayıları içerecek.
Nasıl çalışır?
göre bizim algoritma, adımlar şu şekilde olacaktır:
) 1 Adım İlk sayı veya 1 (3/2, 3-1) veya (1, 2) konumunda olacaktır. Gelenek gereği, sonraki adımlar için x= 1 ve y= 2'yi düşünün.
) 2 Adım Geri kalan sayıların pozisyonu aşağıdaki şekilde hesaplanacaktır:
2 numaranın konumu:
Bir sonraki sayı (x-1, y+1) veya (0, 3) konumunda olacaktır; bu geçerli bir konum değildir. (a) koşulu kullanıldığında, karşılık gelen geçerli konum (0,0) olacaktır. Yani x= 0, y= 0.
3 numaranın konumu:
3 sayısı (x-1, y+1) veya (-1, 1) konumunda olacaktır ve bu geçerli bir konum değildir. (a) koşulu kullanıldığında, geçerli satır konumu n-1 veya 2 olacaktır. Yani 3 sayısı (2, 1)'de olacaktır. Bir sonraki sayı için x= 2, y= 1.
4 numaranın konumu:
4 sayısı geçerli bir konum olan (x-1, y+1) veya (1, 2) konumunda olmalıdır. Ancak bu konum zaten bir sayı içeriyor. (b) koşuluna göre geçerli konum (1+1, 2-2) veya (2,0) olacaktır. Bir sonraki sayı için x= 2, y= 0.
5 numaranın konumu:
5 sayısı geçerli bir konum olan (x-1, y+1) veya (1, 1) konumunda olmalıdır. Bir sonraki sayı için x= 1, y= 1.
6 numaranın konumu:
6 sayısı geçerli bir konum olan (x-1, y+1) veya (0, 2) konumunda olmalıdır. Bir sonraki sayı için x= 0, y= 2.
7 numaranın konumu:
7 sayısının (x-1, y+1) veya (-1, 3) konumunda olması gerekir ki bu geçerli bir konum değildir. (c) koşuluna göre geçerli konum (0, n-2) veya (0, 1) olacaktır. Bir sonraki sayı için x= 0, y= 1.
8 numaranın konumu:
8 sayısının (x-1, y+1) veya (-1, 2) konumunda olması gerekir ki bu geçerli bir konum değildir. (a) koşulu kullanıldığında geçerli konum (2, 2) olacaktır. Bir sonraki sayı için x= 2, y= 2.
9 numaranın konumu:
9 sayısının (x-1, y+1) veya (1, 3) konumunda olması gerekir ki bu geçerli bir konum değildir. (a) koşulu kullanıldığında geçerli konum (1, 0) olacaktır.
sözde kod
Begin Declare an array of size n*n Initialize the array to 0 Set row = n/2 Set column = n-1 For all number i: from 1 to n*n If the row = -1 and column = n row = 0 column = n-2 Else If row = -1 row = n-1 If column = n column = 0 If the position already contains a number decrement column by 2 increment row by 1 continue until the position is not 0 Else put the number i into the calculated position increment i Increment column value Decrement row value End
C++ Kod Sihirli Kare
Giriş:
/* A C/C++ program for generating odd order magic squares */ #include <bits/stdc++.h> using namespace std; void GenerateMagicSquare(int n) { int magic[n][n]; //initializing the array for(int i=0; i<n; i++) for(int j=0; j<n; j++) magic[i][j] = 0; //setting row and column value int i = n / 2; int j = n - 1; for (int k = 1; k <= n * n;) { //checking condition (c) if (i == -1 && j == n) { j = n - 2; i = 0; } else { //checking condition (a) if (j == n) j = 0; if (i < 0) i = n - 1; } //checking condition (b) if (magic[i][j]) { j -= 2; i++; continue; } else { //placing the number into the array magic[i][j] = k; k++; } //for the next number setting (i-1, j+1) j++; i--; } //printing the matrix for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << magic[i][j] << " "; cout << endl; } } int main() { //This code works for only odd numbers int n = 7; cout<<"The magic sum is " << n*(n*n+1)/2 <<endl; GenerateMagicSquare(n); return 0; }
Örnek Çıktısı:
The magic sum is 175 20 12 4 45 37 29 28 11 3 44 36 35 27 19 2 43 42 34 26 18 10 49 41 33 25 17 9 1 40 32 24 16 8 7 48 31 23 15 14 6 47 39 22 21 13 5 46 38 30
Python Kod Sihirli Kare
def GenerateMagicSquare(n): #initializing the array magic = [[0 for x in range(n)] for y in range(n)] #setting row and column value i = n // 2 j = n - 1 k = 1 while k <= (n * n): #checking condition (c) if i == -1 and j == n: j = n - 2 i = 0 else: #checking condition (a) if j == n: j = 0 if i < 0: i = n - 1 #checking conditon (b) if magic[i][j]: j = j - 2 i = i + 1 continue else: #placing the number into the array magic[i][j] = k k = k + 1 #for the next number setting (i-1, j+1) j = j + 1 i = i - 1 #printing the matrix for i in range(0, n): for j in range(0, n): print('%2d ' % (magic[i][j]),end='') if j == n - 1: print() #This code works for only odd numbers n = 7 print("The magic sum is ",n * (n * n + 1) // 2, "\n") GenerateMagicSquare(n)
Örnek Çıktısı:
The magic sum is 175 20 12 4 45 37 29 28 11 3 44 36 35 27 19 2 43 42 34 26 18 10 49 41 33 25 17 9 1 40 32 24 16 8 7 48 31 23 15 14 6 47 39 22 21 13 5 46 38 30
Karmaşıklık Analizi
- Uzay Karmaşıklığı: Sihirli kare matrisi korumak için bir *n dizisine ihtiyacımız var. Bu nedenle, uzay karmaşıklığı O(n^2) olacaktır.
- Zaman Karmaşıklığı: Sihirli kareler matematiğini üretmek için kullandığımız kod iki döngüden oluşur. Dış döngü n kez çalışır ve iç döngü de n kez çalışır. Sonuç olarak zaman karmaşıklığı O(n^2)'dir.