Cuadrado mágico en Java

Cómo generar un cuadrado mágico en Java

Programa para generar un cuadrado mágico de orden N, siendo N un entero positivo e impar. 

Un cuadrado mágico de orden N es una matriz cuadrada de N filas y N columnas que contiene los números naturales desde 1 hasta N2. Los números se distribuyen dentro de la matriz de forma que todas las filas, columnas y diagonales principales suman lo mismo. 

Por ejemplo, un cuadrado mágico de orden 3 es una matriz de tamaño 3 x 3 con el siguiente contenido:

  8  1  6
  3  5  7
  4  9  2

Se puede comprobar todas las filas de la matriz suman 15, todas las columnas suman 15 y las dos diagonales suman 15.

Un cuadrado mágico de orden 5 es una matriz de 5 x 5 con el siguiente contenido:

 17   24    1    8   15
 23    5    7   14   16
  4    6   13   20   22
 10   12   19   21    3
 11   18   25    2    9

En este caso todas las filas, columnas y diagonales suman 65

Un cuadrado mágico de orden N se construye siguiendo las siguientes reglas:

  • El número 1 se coloca en la casilla central de la primera fila.
  • Cada número siguiente se coloca en la casilla correspondiente a la fila anterior y columna siguiente del último número que se ha introducido.
  • Si el número a introducir sigue a un múltiplo de N,  no se aplica la regla anterior sino que se coloca en la casilla de la fila posterior e igual columna.
  • Se considera que la fila anterior a la primera es la última y la columna posterior a la última es la primera.

Vamos a escribir un programa Java que genere e imprima un cuadrado mágico de orden N según estas normas.

Solución:

/*
 * Programa que genera un cuadrado mágico de orden N, siendo N un entero positivo e impar. 
 */
import java.util.Scanner;
public class CuadradoMagico {

    public static void main(String[] args) {
        //crear el array
        int[][] M = crearArray();

        //generar cuadrado mágico
        cuadradoMagico(M);

        //mostrar el array 
        mostrarMatriz(M);
    }

    //método que crea un array cuadrado de N filas y N columnas
    //el número de filas se introduce por teclado y se
    //se crea y devuelve una matriz de ese tamaño
    public static int[][] crearArray() {
        Scanner sc = new Scanner(System.in);
        int filas;
        //lectura del número de filas
        do {
            System.out.print("Número de filas (impar): ");
            filas = sc.nextInt();
        } while (filas % 2 == 0 || filas < 0);
        //crear la matriz cuadradda 
        int[][] A = new int[filas][filas];
        return A;
    }

    //método para crear un cuadrado mágico
    //el método recibe una matriz y le asigna valores de forma
    //que la matriz sea un cuadrado mágico
    public static void cuadradoMagico(int[][] matriz) {                                                           
        int N = matriz.length;
        int i = 0, j = N / 2, cont = 1;
        boolean multiplo = false;
        matriz[i][j] = cont; //se coloca el 1 en el elemento central de la primera fila
        for (cont = 2; cont <= N * N; cont++) { //for para colocar el resto de elementos en la matriz
            if (!multiplo) {        //si el anterior número no es múltiplo de N
                i--;                //fila anterior
                if (i < 0){ 
                    i = N - 1;
                }
                j++;                //columna siguiente
                if (j >= N){ 
                    j = 0; 
                }
            } else {                //si el anterior número es múltiplo de N
                i++;                //fila siguiente, misma columna 
                if (i >= N){
                    i = 0;
                }
            }
            matriz[i][j] = cont;
            if (cont % N == 0){     //comprobamos si número actual es multiplo de N
                multiplo = true;
            } else { 
                multiplo = false;
            }
        }
    }

    //método para mostrar el cuadrado mágico por pantalla
    public static void mostrarMatriz(int[][] A) {
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; j < A[i].length; j++) {
                System.out.printf("%5d", A[i][j]);
            }
            System.out.println();
        }
    }
}

No hay comentarios:

Publicar un comentario