Ungerade magische Quadrate in Java

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

Ungerade magische Quadrate

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.

Odd Magic Squares Frage

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.

Programmanforderungen

  • Ein Benutzer muss in der Lage sein, die Größe des magischen Quadrats einzugeben.
  • Sie dürfen nur eine ungerade Zahl eingeben.
  • Verwenden Sie eine Methode, um das magische Quadrat zu erstellen.
  • Verwenden Sie eine Methode, um das magische Quadrat anzuzeigen.

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.

Odd Magic Square-Lösung

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);