كيفية حل لغز المربع السحري 3×3 في لغة C و Python
⚡ ملخص ذكي
تقوم ألغاز المربع السحري بترتيب الأرقام المتتالية داخل شبكة n × n بحيث ينتج كل صف وعمود وقطر رئيسي نفس المجموع، والذي يسمى الثابت السحري، مما يجعلها تمرينًا كلاسيكيًا في الرياضيات الترفيهية والتفكير الخوارزمي.

ما هو المربع السحري؟
المربع السحري هو مصفوفة مربعة ذات ترتيب خاص للأرقام. تُوضع القيم بحيث يبقى مجموع كل صف وكل عمود وكلا القطرين الرئيسيين ثابتًا. تُعد المربعات السحرية ألغازًا منطقية بسيطة تُستخدم في الرياضيات الترفيهية.
مثال على المربعات السحرية:
يوضح الرسم البياني أعلاه مربعًا سحريًا من الرتبة 3. مجموع كل قطر وصف وعمود يساوي 15. يشرح القسم التالي كيفية إنتاج هذا المجموع الثابت.
كيف تعمل المربعات السحرية
المربع السحري من الرتبة n هو مصفوفة من الرتبة n × n تحتوي على n² عددًا صحيحًا موجبًا. يُطلق على عدد الصفوف أو الأعمدة رتبة المصفوفة.
تتميز ألغاز المربعات السحرية النموذجية بترتيب فردي وتستخدم الأعداد الصحيحة من 1 إلى n². ولأن مجموع كل صف وعمود وقطر يجب أن يساوي القيمة نفسها، تُسمى هذه القيمة بالمجموع السحري أو الثابت السحري. يعتمد هذا الثابت على n فقط. صيغة المجموع السحري من الرتبة n هي:
لنفترض وجود مربع سحري من الرتبة 3. إذن، يكون المجموع السحري كما يلي:
تشرح هذه الصيغة العمليات الحسابية، لكن اللغز له تاريخ ثقافي طويل يمنحه اسمه الذي لا يُنسى.
لماذا تُسمى سحرية؟
كان علماء الرياضيات القدماء مفتونين بالتركيبات العددية المثيرة للاهتمام، وكان المربع السحري أحدها. ويعود أقدم دليل على ذلك إلى الصين حوالي عام 190 قبل الميلاد.
تشير الدراسات إلى وجود أدلة على ألغاز المربعات السحرية في اليابان القديمة والهند والجزيرة العربية. ربطت الأساطير هذه الترتيبات بالعالم السحري، وبقي الاسم متداولاً. وإلى جانب الحكايات الشعبية، وضع علماء الرياضيات أيضاً تصنيفات رسمية تميز مربعاً عن آخر.
أنواع المربع السحري
توجد عدة أنواع من المربعات السحرية في الرياضيات:
- المربع السحري العادي: يحتوي على أول n² من الأعداد الطبيعية.
- الساحة شبه السحرية: مجموع الصفوف والأعمدة فقط هو ما يُشكّل الثابت السحري.
- المربع السحري البسيط: تُشكل الصفوف والأعمدة والقطران الرئيسيان معًا الثابت السحري.
- المربع السحري الأكثر مثالية: مربع سحري عادي مع خاصيتين إضافيتين. كل مربع فرعي بحجم 2 × 2 من المصفوفة مجموعه يساوي 2(ن²+1)، وأي زوج من الأرقام يفصل بينهما ن/2 خلية مجموعهما يساوي ن²+1.
توجد تصنيفات أخرى بناءً على خصائص إضافية. عندما يُستخدم مصطلح "المربع السحري" دون تحديد في هذا الشرح، فإنه يشير إلى مربع سحري عادي وبسيط من رتبة فردية.
خوارزمية لتوليد المربع السحري
الخوارزمية الكلاسيكية لتوليد مربع سحري من رتبة فردية، والتي تسمى طريقة السيامي، هي كما يلي:
- يُخزَّن الرقم الأول (1) في الموضع (n/2, n-1)، حيث يُمثِّل الإحداثي الأول فهرس الصف، والثاني فهرس العمود. في الخطوات اللاحقة، سنُسمِّي هذا الموضع (x, y).
- يُوضع الرقم التالي عند النقطة (س - ١، ص + ١). إذا كان هذا الموضع غير صالح، تُطبق القواعد التالية:
- إذا كان فهرس الصف هو -1، فقم بتدويره إلى n-1. إذا كان فهرس العمود هو n، فقم بتدويره إلى 0.
- إذا كان الموضع المحسوب يحتوي بالفعل على رقم، فقم بزيادة الصف بمقدار 1 وخفض العمود بمقدار 2.
- إذا كان الصف -1 والعمود n في نفس الوقت، فإن الموضع الجديد هو (0، n-2).
ملاحظة: تُنتج هذه الخوارزمية مربعات سحرية صالحة فقط من الرتبة الفردية. والنتيجة هي مربع سحري عادي يحتوي على أول n² عددًا طبيعيًا. قد يكون هناك أكثر من حل صالح لنفس قيمة n.
تتضح القواعد أكثر من خلال مثال صغير مع الترتيب 3، والذي يستخدم الأرقام من 1 إلى 9.
كيفية عملها على مربع 3 × 3
تطبيق خوارزمية الخطوات المذكورة أعلاه هي:
الخطوة 1) يُوضع الرقم الأول (1) عند النقطة (3/2، 3-1) أو (1، 2). في الخطوات اللاحقة، نُعيّن قيمة x = 1 وقيمة y = 2.
الخطوة 2) يتم حساب مواقع الأرقام المتبقية على النحو التالي.
موقف رقم 2:
يجب أن يكون الرقم التالي في الموضع (x-1, y+1) أو (0, 3)، وهو موضع غير صالح. وفقًا للقاعدة (أ)، يلتف العمود إلى الصفر، مما يعطي الموضع (0, 0). لنفترض أن x = 0 و y = 0.
موقف رقم 3:
يجب أن يكون الرقم 3 عند (x-1, y+1) أو (-1, 1)، وهو موقع غير صحيح. وفقًا للقاعدة (أ)، ينتقل الصف إلى n-1 (أي 2). لذا، ينتقل الرقم 3 إلى (2, 1). نُعيّن x = 2 و y = 1.
موقف رقم 4:
يجب أن يكون الرقم 4 عند (س - 1، ص + 1) أو (1، 2)، وهو موقع صحيح ولكنه يحتوي بالفعل على الرقم 1. وفقًا للقاعدة (ب)، يكون الموقع الجديد عند (1 + 1، 2 - 2) أو (2، 0). لنفترض أن س = 2، ص = 0.
موقف رقم 5:
يجب أن يكون الرقم 5 عند (x-1, y+1) أو (1, 1)، وهو موضع فارغ صالح. ضع x = 1 و y = 1.
موقف رقم 6:
يجب أن يكون الرقم 6 عند (x-1, y+1) أو (0, 2)، وهو موضع فارغ صالح. ضع x = 0 و y = 2.
موقف رقم 7:
يجب أن يكون الرقم 7 عند (x-1, y+1) أو (-1, 3)، وهذا غير صحيح. وفقًا للقاعدة (ج)، يكون الموضع الجديد عند (0, n-2) أو (0, 1). لنفترض أن x = 0 و y = 1.
موقف رقم 8:
يجب أن يكون الرقم 8 عند (x-1, y+1) أو (-1, 2)، وهذا غير صحيح. وفقًا للقاعدة (أ)، ينتقل الصف إلى 2، مما يعطي (2, 2). لنفترض أن x = 2 و y = 2.
موقف رقم 9:
يجب أن يكون الرقم 9 عند (x-1, y+1) أو (1, 3)، وهو أمر غير صحيح. وفقًا للقاعدة (أ)، يلتف العمود إلى 0، مما يعطي (1, 0).
مع ملء كل خلية، يتم ترجمة نفس المنطق مباشرة إلى شبه كود.
الشفرة الزائفة للمربع السحري
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++ و Python.
C++ Code للمربع السحري
الإدخال:
/* 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; }
إخراج المثال:
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 يستخدم الإصدار أدناه نفس قواعد الصفوف والأعمدة.
Python Code للمربع السحري
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)
إخراج المثال:
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
يتصرف كلا التطبيقين بشكل متطابق، مما يسهل مقارنة تكلفتهما.
تحليل التعقيد
- تعقيد الفضاء: يتم تخزين المربع السحري في مصفوفة بحجم n × n، لذا فإن التعقيد المكاني هو O(n²).
- تعقيد الوقت: يستخدم المولد حلقتين متداخلتين. يتم تشغيل الحلقة الخارجية n مرة، ويتم تشغيل الحلقة الداخلية أيضًا n مرة، لذا فإن التعقيد الزمني الإجمالي هو O(n²).













