Es ist unklar, wer zuerst ein magisches Quadrat erfunden hat. Es gibt eine Geschichte über eine riesige Flut in China vor langer Zeit. Die Menschen hatten Angst, weggespült zu werden, und versuchten, den Flussgott durch Opfer zu besänftigen. Nichts schien zu funktionieren, bis ein Kind bemerkte, dass eine Schildkröte ein magisches Quadrat auf dem Rücken trug, das das Opfer immer wieder umkreiste. Der Platz sagte den Leuten, wie groß ihr Opfer sein musste, um sich selbst zu retten. Seitdem waren magische Quadrate die Mode für jede anspruchsvolle Schildkröte.
Niveau: Anfänger
Fokus: Logik, Arrays, Methoden
Falls Sie noch nie zuvor auf eines gestoßen sind, ist ein magisches Quadrat eine Anordnung von aufeinander folgenden Zahlen in einem Quadrat, sodass sich die Zeilen, Spalten und Diagonalen zu derselben Zahl addieren. Zum Beispiel ist ein 3x3 magisches Quadrat:
8 1 6
3 5 7
4 9 2
Jede Zeile, Spalte und Diagonale ergibt 15.
Diese Programmierübung befasst sich mit der Erzeugung magischer Quadrate mit ungerader Größe (d. H. Die Größe des Quadrats kann nur eine ungerade Zahl sein, 3 × 3, 5 × 5, 7 × 7, 9 × 9 usw.). Der Trick bei der Erstellung eines solchen Quadrats besteht darin, die Nummer 1 in die erste Zeile und die mittlere Spalte zu setzen. Um herauszufinden, wo die nächste Nummer platziert werden soll, bewegen Sie sich diagonal nach oben rechts (d. H. Eine Zeile nach oben und eine Spalte nach oben). Wenn eine solche Bewegung bedeutet, dass Sie vom Quadrat fallen, wickeln Sie sich um die Reihe oder Spalte auf der gegenüberliegenden Seite. Wenn der Zug Sie zu einem bereits ausgefüllten Feld führt, kehren Sie zum ursprünglichen Feld zurück und bewegen Sie sich um eins nach unten. Wiederholen Sie den Vorgang, bis alle Felder ausgefüllt sind.
Zum Beispiel würde ein 3x3 magisches Quadrat so beginnen:
0 1 0
0 0 0
0 0 0
Eine Bewegung diagonal nach oben bedeutet, dass wir uns um den unteren Rand des Quadrats drehen:
0 1 0
0 0 0
0 0 2
Ebenso bedeutet die nächste diagonale Bewegung nach oben, dass wir zur ersten Spalte übergehen:
0 1 0
3 0 0
0 0 2
Jetzt ergibt die diagonale Bewegung nach oben ein Quadrat, das bereits gefüllt ist, also kehren wir zu der Stelle zurück, von der wir gekommen sind, und lassen eine Reihe nach unten fallen:
0 1 0
3 0 0
4 0 2
und es geht weiter und weiter, bis alle Quadrate voll sind.
Die Frage ist, ob Ihr Programm ein magisches 5x5-Quadrat wie das folgende erstellen kann?
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
Hinweis: Abgesehen von den Programmieraspekten dieser Übung handelt es sich auch um einen Logiktest. Machen Sie nacheinander die einzelnen Schritte zur Erstellung des magischen Quadrats und überlegen Sie, wie dies mit einem zweidimensionalen Array geschehen kann.
Ihr Programm sollte in der Lage sein, das folgende 5x5 magische Quadrat zu erstellen:
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
Hier ist meine Version:
import java.util.Scanner;
public class MagicOddSquare
public static void main (String [] args)
Scannereingang = neuer Scanner (System.in);
int [] [] magicSquare;
boolean isAcceptableNumber = false;
int size = -1;
// Akzeptiere nur ungerade Zahlen
while (isAcceptableNumber == false)
System.out.println ("Geben Sie die Größe des Quadrats ein:");
String sizeText = input.nextLine ();
size = Integer.parseInt (sizeText);
if (Größe% 2 == 0)
System.out.println ("Die Größe muss eine ungerade Zahl sein");
isAcceptableNumber = false;
sonst
isAcceptableNumber = true;
magicSquare = createOddSquare (Größe);
displaySquare (magicSquare);
private static int [] [] createOddSquare (int size)
int [] [] magicSq = new int [Größe] [Größe];
int row = 0;
Spalte int = Größe / 2;
int lastRow = row;
int lastColumn = column;
int matrixSize = Größe * Größe;
magicSq [Zeile] [Spalte] = 1;
für (int k = 2; k < matrixSize+1;k++)
// überprüfe, ob wir in die gegenüberliegende Zeile umbrechen müssen
if (Zeile - 1 < 0)
Zeile = Größe 1;
sonst
Reihe--;
// überprüfe, ob wir in die gegenüberliegende Spalte springen müssen
if (Spalte + 1 == Größe)
Spalte = 0;
sonst
column ++;
// Wenn diese Position nicht leer ist, gehe zurück zu wo wir sind
// gestartet und eine Zeile nach unten verschoben
if (magicSq [Zeile] [Spalte] == 0)
magicSq [Zeile] [Spalte] = k;
sonst
row = lastRow;
column = lastColumn;
if (Zeile + 1 == Größe)
row = 0;
sonst
row ++;
magicSq [Zeile] [Spalte] = k;
lastRow = row;
lastColumn = column;
return magicSq;
private static void displaySquare (int [] [] magicSq)
int magicConstant = 0;
für (int j = 0; j<(magicSq.length);j++)
für (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 ("Die magische Konstante ist" + magicConstant);