Como resolver o quebra-cabeça quadrado mágico 3x3 em C & Python

⚡ Resumo Inteligente

Os quebra-cabeças do Quadrado Mágico organizam números consecutivos em uma grade n por n de forma que cada linha, coluna e diagonal principal produza o mesmo total, chamado de constante mágica, o que os torna um exercício clássico de matemática recreativa e pensamento algorítmico.

  • 🔢 Fórmula da Constante Mágica: Para qualquer quadrado mágico normal de ordem n, a soma mágica é igual a n(n²+1)/2, que produz 15 para ordem 3 e 175 para ordem 7.
  • 🧩 Método Siamês: Os quadrados mágicos de ordem ímpar são gerados colocando o número 1 no meio da linha superior e, em seguida, movendo-se para cima e para a direita, levando em consideração as regras de repetição e colisão.
  • 📐 Variantes quadradas: Os quadrados mágicos são classificados como Normais, Semimágicos, Simples e Perfeitos, sendo cada variante definida pelas somas que devem corresponder à constante mágica.
  • Implementações práticas: Idêntico C++ e Python Os programas constroem qualquer quadrado de ordem ímpar em tempo O(n²) usando espaço auxiliar O(n²).
  • 🧪 Demonstração passo a passo: Uma análise detalhada do diagrama 3x3 mostra como cada uma das nove posições satisfaz as regras de linha, coluna e diagonal.

O que é um quadrado mágico?

Um quadrado mágico é uma matriz quadrada com uma disposição especial de números. Os valores são colocados de forma que a soma em cada linha, cada coluna e ambas as diagonais principais permaneça a mesma. Os quadrados mágicos são quebra-cabeças lógicos simples usados ​​em matemática recreativa.

Exemplo de quadrados mágicos:

Quadrado Mágico

O diagrama acima mostra um quadrado mágico de ordem 3. A soma de cada diagonal, linha e coluna é igual a 15. A próxima seção explica como esse total constante é obtido.

Como funcionam os quadrados mágicos

Um quadrado mágico de ordem n é uma matriz n por n contendo n² inteiros positivos. O número de linhas ou colunas é chamado de ordem da matriz.

Os quebra-cabeças de quadrados mágicos típicos têm uma ordem ímpar e usam os números inteiros de 1 a n². Como a soma de cada linha, coluna e diagonal deve ser a mesma, esse valor é chamado de soma mágica ou constante mágica. A constante depende apenas de n. A fórmula para a soma mágica de ordem n é:

Quadrado Mágico funciona

Considere um quadrado mágico de ordem 3. A soma mágica, então, é:

Quadrado Mágico funciona

Quadrado Mágico funciona

Essa fórmula explica a aritmética, mas o enigma tem uma longa história cultural que lhe confere seu nome memorável.

Por que são chamadas de mágicas?

Os matemáticos da antiguidade eram fascinados por combinações interessantes de números, e o quadrado mágico era uma delas. As primeiras evidências datam da China, por volta de 190 a.C.

Estudos mostram evidências de quebra-cabeças de quadrados mágicos no Japão antigo, na Índia e na Arábia. Lendas ligavam esses arranjos ao mundo mágico, e o nome permaneceu. Além do folclore, matemáticos também definiram categorias formais que distinguem um quadrado do outro.

Tipos de Quadrado Mágico

Existem diversas variantes de quadrados mágicos na matemática:

  • Quadrado Mágico Normal: Contém os primeiros n² números naturais.
  • Quadrado Semi-Mágico: Apenas as linhas e as colunas somam a constante mágica.
  • Quadrado Mágico Simples: As linhas, colunas e ambas as diagonais principais somam a constante mágica.
  • Quadrado Mágico Mais Perfeito: Um quadrado mágico normal com duas propriedades extras. Cada subquadrado 2 por 2 da matriz soma 2(n²+1), e qualquer par de números que estejam a n/2 células de distância soma n²+1.

Existem outras categorias baseadas em propriedades adicionais. Sempre que o termo "quadrado mágico" for usado sem qualificação neste tutorial, ele se referirá a um quadrado mágico simples, normal e de ordem ímpar.

Algoritmo para gerar um quadrado mágico

O algoritmo clássico para gerar um quadrado mágico de ordem ímpar, chamado método siamês, é o seguinte:

  • O primeiro número (1) é armazenado na posição (n/2, n-1), onde a primeira coordenada é o índice da linha e a segunda é o índice da coluna. Para etapas posteriores, chamemos esta posição de (x, y).
  • O próximo número é colocado em (x-1, y+1). Se essa posição for inválida, aplique as seguintes regras:
    1. Se o índice da linha for -1, arredonde para n-1. Se o índice da coluna for n, arredonde para 0.
    2. Se a posição calculada já contiver um número, incremente a linha em 1 e decremente a coluna em 2.
    3. Se a linha for -1 e a coluna for n ao mesmo tempo, a nova posição será (0, n-2).

Observação: Este algoritmo gera apenas quadrados mágicos válidos de ordem ímpar. O resultado é um quadrado mágico normal contendo os primeiros n² números naturais. Pode haver mais de uma solução válida para o mesmo n.

As regras ficam mais claras através de um pequeno exemplo com a ordem 3, que usa os números de 1 a 9.

Como funciona em um quadrado de 3 por 3

Aplicando o algoritmo Acima, os passos são:

Passo 1) O primeiro número (1) é colocado em (3/2, 3-1) ou (1, 2). Para etapas posteriores, defina x = 1 e y = 2.

Algoritmo para gerar quadrado mágico

Passo 2) As posições dos números restantes são calculadas da seguinte forma.

Posição do número 2:

O próximo número deveria ir para (x-1, y+1) ou (0, 3), que não é uma posição válida. Pela regra (a), a coluna retorna a 0, resultando em (0, 0). Defina x = 0, y = 0.

Algoritmo para gerar quadrado mágico

Posição do número 3:

O número 3 deveria estar em (x-1, y+1) ou (-1, 1), o que não é uma posição válida. Pela regra (a), a linha retorna a n-1 (que é 2). Portanto, o número 3 vai para (2, 1). Defina x = 2, y = 1.

Algoritmo para gerar quadrado mágico

Posição do número 4:

O número 4 deveria estar em (x-1, y+1) ou (1, 2), o que é válido, mas já contém 1. Pela regra (b), a nova posição é (1+1, 2-2) ou (2, 0). Defina x = 2, y = 0.

Algoritmo para gerar quadrado mágico

Posição do número 5:

O número 5 deve estar em (x-1, y+1) ou (1, 1), que é uma posição vazia válida. Defina x = 1, y = 1.

Algoritmo para gerar quadrado mágico

Posição do número 6:

O número 6 deve estar em (x-1, y+1) ou (0, 2), que é uma posição vazia válida. Defina x = 0, y = 2.

Algoritmo para gerar quadrado mágico

Posição do número 7:

O número 7 deveria estar em (x-1, y+1) ou (-1, 3), o que não é válido. Pela regra (c), a nova posição é (0, n-2) ou (0, 1). Defina x = 0, y = 1.

Algoritmo para gerar quadrado mágico

Posição do número 8:

O número 8 deveria estar em (x-1, y+1) ou (-1, 2), o que não é válido. Pela regra (a), a linha retorna a 2, resultando em (2, 2). Defina x = 2, y = 2.

Algoritmo para gerar quadrado mágico

Posição do número 9:

O número 9 deveria estar em (x-1, y+1) ou (1, 3), o que não é válido. Pela regra (a), a coluna volta para 0, resultando em (1, 0).

Algoritmo para gerar quadrado mágico

A cada célula preenchida, a mesma lógica se traduz diretamente em pseudocódigo.

Pseudocódigo para Quadrado Mágico

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

O pseudocódigo mapeia diretamente para linguagens compiladas e interpretadas, mostradas a seguir em C++ e Python.

C++ Code para o Quadrado Mágico

Entrada:

/*
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;
}

Saída do exemplo:

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

O Python A versão abaixo usa regras idênticas para linhas e colunas.

Python Code para o Quadrado Mágico

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)

Saída do exemplo:

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

Ambas as implementações se comportam de maneira idêntica, facilitando a comparação de seus custos.

Análise de Complexidade

  • Complexidade do espaço: O quadrado mágico é armazenado em uma matriz n por n, portanto a complexidade de espaço é O(n²).
  • Complexidade de tempo: O gerador usa dois loops aninhados. O loop externo é executado n vezes e o loop interno também é executado n vezes, portanto a complexidade de tempo geral é O(n²).

Perguntas Frequentes

Para um quadrado mágico normal de 3 por 3 que contém os números de 1 a 9, a constante mágica é 15. Cada linha, coluna e diagonal principal deve somar 15, o que decorre da fórmula n(n²+1)/2 com n igual a 3.

Não. O método siamês mostrado neste tutorial é definido apenas para quadrados mágicos de ordem ímpar. Ordens pares requerem algoritmos diferentes, como as construções duplamente pares (n divisível por 4) e simplesmente pares (n igual a 4k+2), que usam regras distintas.

O gerador preenche uma matriz n por n, portanto, tanto a complexidade de tempo quanto a de espaço são O(n²). Cada célula é visitada um número constante de vezes, e o armazenamento é exatamente n² inteiros. Isso torna o algoritmo eficiente para tamanhos recreativos típicos.

Técnicas de IA, como algoritmos genéticos, recozimento simulado e solucionadores de satisfação de restrições, podem buscar quadrados mágicos válidos quando métodos de forma fechada não se aplicam, incluindo ordens pares, quadrados parciais e variantes com restrições extras, como quadrados mágicos somente com números primos ou quadrados mágicos geométricos.

Os quadrados mágicos são problemas de referência para otimização combinatória, agentes de aprendizado por reforço e busca neural. Pesquisadores os utilizam para testar heurísticas, metaheurísticas e planejadores de IA em espaços discretos estruturados, visto que as soluções são fáceis de verificar, mas contá-las permanece um problema matemático em aberto.

Resuma esta postagem com: