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:

Sihirli Kare

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:

Sihirli Meydan çalışıyor

Tamsayıları 3 olan sihirli kare örneğini ele alalım. Yani sihirli toplam şöyle olur:

Sihirli Meydan çalışıyor

Sihirli Meydan çalışıyor

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.
    1. Satır konumu -1 ise n-1'e çarpılacaktır. Benzer şekilde, hesaplanan sütun konumu n ise 0'a çarpacaktır.
    2. Hesaplanan konum zaten bir sayı içeriyorsa satır konumu 1 artırılır ve sütun konumu 2 azaltılır.
    3. 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.

Sihirli Kare Oluşturma Algoritması

) 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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.

Sihirli Kare Oluşturma Algoritması

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.