No está claro a quién se le ocurrió un cuadrado mágico. Hay una historia sobre una gran inundación en China hace mucho tiempo. La gente estaba preocupada de que fueran arrastrados e intentaron apaciguar al dios del río haciendo sacrificios. Nada parecía funcionar hasta que un niño notó que una tortuga lucía un cuadrado mágico en su espalda que seguía dando vueltas al sacrificio. La plaza le dijo a la gente cuán grande debía ser su sacrificio para salvarse. Desde entonces, los cuadrados mágicos han sido la moda de cualquier tortuga exigente..
Nivel: Principiante
Atención: Lógica, matrices, métodos
En caso de que nunca haya encontrado uno antes, un cuadrado mágico es una disposición de números secuenciales en un cuadrado para que las filas, columnas y diagonales se sumen al mismo número. Por ejemplo, un cuadrado mágico de 3x3 es:
8 1 6
3 5 7
4 9 2
Cada fila, columna y diagonal suma 15.
Este ejercicio de programación tiene que ver con la creación de cuadrados mágicos de tamaño impar (es decir, el tamaño del cuadrado solo puede ser un número impar, 3x3, 5x5, 7x7, 9x9, etc.). El truco para hacer un cuadrado así es colocar el número 1 en la primera fila y en la columna central. Para encontrar dónde colocar el siguiente número, muévase diagonalmente hacia arriba a la derecha (es decir, una fila hacia arriba, una columna de ancho). Si tal movimiento significa que se cae del cuadrado, envuélvase a la fila o columna en el lado opuesto. Finalmente, si el movimiento te lleva a un cuadrado que ya está lleno, regresa al cuadrado original y muévete hacia abajo en uno. Repita el proceso hasta llenar todos los cuadrados..
Por ejemplo, un cuadrado mágico de 3x3 comenzaría así:
0 1 0
0 0 0
0 0 0
Un movimiento en diagonal hacia arriba significa que nos envolvemos en la parte inferior del cuadrado:
0 1 0
0 0 0
0 0 2
Del mismo modo, el siguiente movimiento diagonal hacia arriba significa que nos ajustamos a la primera columna:
0 1 0
3 0 0
0 0 2
Ahora el movimiento diagonal hacia arriba da como resultado un cuadrado que ya está lleno, así que volvemos a donde venimos y desplegamos una fila:
0 1 0
3 0 0
4 0 2
y continúa y sigue hasta que todos los cuadrados estén llenos.
La pregunta es si su programa puede crear un cuadrado mágico de 5x5 como el siguiente?
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
Insinuación: Además de los aspectos de programación de este ejercicio, también es una prueba de lógica. Siga cada paso de la creación del cuadrado mágico a su vez y descubra cómo se puede hacer con una matriz bidimensional.
Su programa debería haber sido capaz de crear el cuadrado mágico de 5x5 a continuación:
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
Aquí está mi versión:
import java.util.Scanner;
clase pública MagicOddSquare
public static void main (String [] args)
Entrada del escáner = nuevo escáner (System.in);
int [] [] magicSquare;
boolean isAcceptableNumber = false;
int tamaño = -1;
// solo acepta números impares
while (isAcceptableNumber == false)
System.out.println ("Ingrese el tamaño del cuadrado:");
Cadena sizeText = input.nextLine ();
size = Integer.parseInt (sizeText);
si (tamaño% 2 == 0)
System.out.println ("El tamaño debe ser un número impar");
isAcceptableNumber = false;
más
isAcceptableNumber = true;
magicSquare = createOddSquare (tamaño);
displaySquare (magicSquare);
private static int [] [] createOddSquare (tamaño int)
int [] [] magicSq = new int [tamaño] [tamaño];
int fila = 0;
int columna = tamaño / 2;
int lastRow = fila;
int lastColumn = column;
int matrixSize = tamaño * tamaño;
magicSq [fila] [columna] = 1;
para (int k = 2; k < matrixSize+1;k++)
// verifica si necesitamos ajustar a la fila opuesta
if (fila - 1 < 0)
fila = tamaño-1;
más
fila--;
// verifica si necesitamos ajustar a la columna opuesta
if (columna + 1 == tamaño)
columna = 0;
más
columna ++;
// si esta posición no está vacía, regrese a donde
// comenzó y se mueve una fila hacia abajo
if (magicSq [fila] [columna] == 0)
magicSq [fila] [columna] = k;
más
fila = lastRow;
column = lastColumn;
if (fila + 1 == tamaño)
fila = 0;
más
fila ++;
magicSq [fila] [columna] = k;
lastRow = fila;
lastColumn = column;
return magicSq;
privado vacío vacío displaySquare (int [] [] magicSq)
int magicConstant = 0;
para (int j = 0; j<(magicSq.length);j++)
para (int k = 0; k<(magicSq[j].length);k++)
System.out.print (magicSq [j] [k] + "");
System.out.print;
magicConstant = magicConstant + magicSq [j] [0];
System.out.print ("La constante mágica es" + magicConstant);