Як розв'язати головоломку "Магічний квадрат 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(n²+1), а будь-яка пара чисел, що знаходяться на відстані n/2 клітинок одна від одної, дає в сумі n²+1.

Існують також інші категорії на основі додаткових властивостей. Щоразу, коли термін «магічний квадрат» використовується без уточнення в цьому посібнику, він стосується звичайного, простого магічного квадрата непарного порядку.

Алгоритм генерації магічного квадрата

Класичний алгоритм генерації магічного квадрата непарного порядку, який називається сіамським методом, виглядає наступним чином:

  • Перше число (1) зберігається в позиції (n/2, n-1), де перша координата – це індекс рядка, а друга – індекс стовпця. Для подальших кроків називатимемо цю позицію (x, y).
  • Наступне число розміщується в точці (x-1, y+1). Якщо ця позиція недійсна, застосуйте такі правила:
    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), що не є допустимою позицією. За правилом (a), стовпець переноситься до 0, даючи (0, 0). Встановити x = 0, y = 0.

Алгоритм генерації магічного квадрата

Позиція номер 3:

Номер 3 має бути в точці (x-1, y+1) або (-1, 1), що не є допустимою позицією. За правилом (a), рядок переноситься до n-1 (що дорівнює 2). Отже, номер 3 переходить до (2, 1). Поставте x = 2, y = 1.

Алгоритм генерації магічного квадрата

Позиція номер 4:

Число 4 має бути в точці (x-1, y+1) або (1, 2), що є правильним, але вже містить 1. Згідно з правилом (b), нова позиція буде (1+1, 2-2) або (2, 0). Встановимо x = 2, y = 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), що не є допустимим. Згідно з правилом (c), нова позиція — (0, n-2) або (0, 1). Встановити x = 0, y = 1.

Алгоритм генерації магічного квадрата

Позиція номер 8:

Число 8 має бути в точці (x-1, y+1) або (-1, 2), що не є допустимим. За правилом (a), рядок переноситься на 2, даючи (2, 2). Поставимо x = 2, y = 2.

Алгоритм генерації магічного квадрата

Позиція номер 9:

Число 9 має бути в точці (x-1, y+1) або (1, 3), що не є допустимим. За правилом (a), стовпець переноситься до 0, даючи (1, 0).

Алгоритм генерації магічного квадрата

З кожною заповненою коміркою та сама логіка безпосередньо перетворюється на псевдокод.

Псевдокод для Magic Square

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² цілих чисел. Це робить алгоритм ефективним для типових розмірів рекреаційних об'єктів.

Методи штучного інтелекту, такі як генетичні алгоритми, імітація відпалу та розв'язувачі задач із задоволенням обмежень, можуть шукати дійсні магічні квадрати, коли методи замкнутої форми не застосовуються, включаючи парні порядки, часткові квадрати та варіанти з додатковими обмеженнями, такими як магічні квадрати лише простих чисел або геометричні магічні квадрати.

Магічні квадрати є еталонними задачами для комбінаторної оптимізації, агентів навчання з підкріпленням та нейронного пошуку. Дослідники використовують їх для тестування евристик, метаевристик та планувальників штучного інтелекту на структурованих дискретних просторах, оскільки рішення легко перевірити, але їх підрахунок залишається відкритою математичною проблемою.

Підсумуйте цей пост за допомогою: