كيفية حل لغز المربع السحري 3×3 في لغة C و Python

⚡ ملخص ذكي

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

  • 🔢 صيغة الثابت السحري: بالنسبة لأي مربع سحري عادي من الرتبة n، فإن المجموع السحري يساوي n(n²+1)/2، مما ينتج عنه 15 للرتبة 3 و 175 للرتبة 7.
  • 🧩 طريقة سيامي: يتم إنشاء المربعات السحرية ذات الترتيب الفردي عن طريق وضع الرقم 1 في منتصف الصف العلوي، ثم التحرك لأعلى ولليمين مع مراعاة قواعد الالتفاف والتصادم.
  • 📐 الأشكال المربعة: تُصنف المربعات السحرية إلى مربعات عادية، وشبه سحرية، وبسيطة، ومثالية للغاية، ويتم تحديد كل نوع منها من خلال المجاميع التي يجب أن تتطابق مع الثابت السحري.
  • ✅ تطبيقات عملية: مطابق C++ و Python تقوم البرامج بإنشاء أي مربع من الرتبة الفردية في وقت O(n²) باستخدام مساحة مساعدة O(n²).
  • 🧪 عرض توضيحي خطوة بخطوة: يُظهر شرح تفصيلي 3×3 كيف أن كل موضع من المواضع التسعة يفي بقاعدة الصف والعمود والقطر.

ما هو المربع السحري؟

المربع السحري هو مصفوفة مربعة ذات ترتيب خاص للأرقام. تُوضع القيم بحيث يبقى مجموع كل صف وكل عمود وكلا القطرين الرئيسيين ثابتًا. تُعد المربعات السحرية ألغازًا منطقية بسيطة تُستخدم في الرياضيات الترفيهية.

مثال على المربعات السحرية:

المربع السحري

يوضح الرسم البياني أعلاه مربعًا سحريًا من الرتبة 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. إذا كان فهرس الصف هو -1، فقم بتدويره إلى n-1. إذا كان فهرس العمود هو n، فقم بتدويره إلى 0.
    2. إذا كان الموضع المحسوب يحتوي بالفعل على رقم، فقم بزيادة الصف بمقدار 1 وخفض العمود بمقدار 2.
    3. إذا كان الصف -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²).

الأسئلة الشائعة

بالنسبة للمربع السحري العادي 3 × 3 الذي يحتوي على الأرقام من 1 إلى 9، فإن الثابت السحري هو 15. يجب أن يكون مجموع كل صف وعمود وقطر رئيسي مساوياً لـ 15، وهو ما يتبع من الصيغة n(n²+1)/2 حيث n تساوي 3.

لا. الطريقة السيامية الموضحة في هذا الدرس مخصصة فقط للمربعات السحرية ذات الرتب الفردية. أما الرتب الزوجية فتتطلب خوارزميات مختلفة، مثل المربعات الزوجية المزدوجة (حيث يكون n قابلاً للقسمة على 4) والمربعات الزوجية المفردة (حيث يكون n مساوياً لـ 4k+2)، والتي تستخدم قواعد مختلفة.

يقوم المولد بملء مصفوفة بحجم n×n، لذا فإن تعقيد الوقت والمساحة هو O(n²). تتم زيارة كل خلية عددًا ثابتًا من المرات، وسعة التخزين هي n² عددًا صحيحًا بالضبط. هذا يجعل الخوارزمية فعالة للأحجام الترفيهية النموذجية.

يمكن لتقنيات الذكاء الاصطناعي مثل الخوارزميات الجينية، والتقسية المحاكاة، وحلول إرضاء القيود البحث عن المربعات السحرية الصالحة عندما لا تنطبق الطرق المغلقة، بما في ذلك الرتب الزوجية، والمربعات الجزئية، والمتغيرات ذات القيود الإضافية مثل المربعات السحرية الأولية فقط أو المربعات السحرية الهندسية.

تُعدّ المربعات السحرية مسائل معيارية في مجال التحسين التوافقي، ووكلاء التعلم المعزز، والبحث العصبي. يستخدمها الباحثون لاختبار الخوارزميات الاستدلالية، والخوارزميات فوق الاستدلالية، ومخططات الذكاء الاصطناعي على فضاءات منفصلة منظمة، نظرًا لسهولة التحقق من الحلول، بينما يبقى عدّها مسألة رياضية مفتوحة.

تلخيص هذه التدوينة بـ: