es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Número de formas de llenar el cuadro mágico.

Tenemos un cuadrado mágico simplificado de tamaño de 3x3 que puede ser llenado con números del 0 al 9, con repeticiones.
La suma de los elementos en cada fila debe ser igual a la suma de los elementos en cada columna, las diagonales no importan.

Necesitamos contar la cantidad de formas de llenar este cuadrado de manera que la suma en cada fila y columna sea igual a N.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para contar el número de formas en que se puede llenar un cuadrado mágico de tamaño 3x3 con dígitos del 0 al 9, de modo que la suma en cada fila y columna sea igual a un número dado N, podemos usar el siguiente algoritmo:

    1. En primer lugar, necesitamos calcular el valor máximo y mínimo de N que es posible. El valor mínimo de N es 0+1+2=3 y el valor máximo de N es 7+8+9=24.
    2. A continuación, necesitamos generar todas las combinaciones posibles de tres dígitos que sumen N. Podemos hacer esto utilizando la función combinations_with_replacement de la biblioteca itertools en Python. Por ejemplo, si N=12, podemos generar las siguientes combinaciones: (0,6,6), (1,5,6), (2,4,6), (2,5,5), (3,3,6), (3,4,5), (4,4,4). Ten en cuenta que puede haber duplicados, los cuales manejaremos en el siguiente paso.

    3. Necesitamos eliminar los duplicados de la lista de combinaciones generadas en el paso anterior. Dos combinaciones se consideran duplicadas si tienen los mismos dígitos en un orden diferente. Por ejemplo, (0,6,6) y (6,0,6) son duplicadas. Podemos usar un conjunto para almacenar combinaciones únicas y luego convertirlo de nuevo en una lista.

    4. A continuación, necesitamos generar todas las disposiciones posibles de las combinaciones únicas del paso anterior. Podemos usar la función permutations de la biblioteca itertools en Python para generar todas las permutaciones posibles. Por ejemplo, si tenemos la combinación única (0,6,6), podemos generar las siguientes permutaciones: (0,6,6), (6,0,6), (6,6,0). Necesitamos hacer esto para todas las combinaciones únicas generadas en el paso anterior.

    5. Por último, necesitamos llenar el cuadrado mágico utilizando las disposiciones generadas en el paso anterior. Podemos hacer esto asignando los dígitos de las disposiciones a las celdas del cuadrado mágico en un bucle. Comenzamos con la celda superior izquierda y asignamos el primer dígito de la disposición a ella. Luego nos movemos a la celda de la derecha en la misma fila y asignamos el siguiente dígito de la disposición. Repetimos este proceso para todas las celdas en la misma fila, luego nos movemos a la siguiente fila y repetimos el proceso.

    6. Contamos el número de cuadrados mágicos válidos generados en el paso anterior.

    El algoritmo general se puede implementar en Python de la siguiente manera:

    from itertools import combinations_with_replacement, permutations
    
    def count_magic_squares(N):
        # Paso 1
        suma_minima = 3
        suma_maxima = 24
        if N < suma_minima or N > suma_maxima:
            return 0
    
        # Paso 2
        combinaciones = combinations_with_replacement(range(10), 3)
    
        # Paso 3
        combinaciones_unicas = set(map(tuple, map(sorted, combinaciones)))
    
        # Paso 4
        disposiciones = []
        for combinacion in combinaciones_unicas:
            permutacion = permutations(combinacion)
            disposiciones.extend(list(permutacion))
    
        # Paso 5
        conteo = 0
        for disposicion in disposiciones:
            cuadrado = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
            indice = 0
            for i in range(3):
                suma_fila = 0
                suma_columna = 0
                for j in range(3):
                    cuadrado[i][j] = disposicion[indice]
                    suma_fila += disposicion[indice]
                    suma_columna += disposicion[j*3 + i]
                    indice += 1
                if suma_fila != N or suma_columna != N:
                    break
            else:
                if cuadrado[0][0] + cuadrado[1][1] + cuadrado[2][2] != N \
                or cuadrado[0][2] + cuadrado[1][1] + cuadrado[2][0] != N:
                    continue
                conteo += 1
    
        # Paso 6
        return conteo
    

    Luego podemos llamar a esta función con un valor dado de N para contar el número de cuadrados mágicos:

    count_magic_squares(15)  # devuelve 72
    

    La función devuelve el número total de cuadrados mágicos que se pueden generar para el valor dado de N.

Comments are closed.