Odd Magic Squares i Java

Det är oklart vem som först kom med en magisk fyrkant. Det finns en historia om en enorm översvämning i Kina för länge sedan. Folket var oroliga för att de skulle tvättas bort och försökte lugna flodguden genom att offra. Ingenting tycktes fungera förrän ett barn märkte en sköldpadda som spelade en magisk fyrkant på baksidan som fortsatte att omgå offret. Torget berättade för folket hur stort deras offer behövde vara för att rädda sig själva. Sedan dess har magiska fyrkanter varit höjden av mode för alla kräsna sköldpaddor.

Nivå: Nybörjare

Fokus: Logik, matriser, metoder

Udda magiska fyrkanter

Om du aldrig har stött på en tidigare, är en magisk fyrkant ett arrangemang av sekvensnummer i en kvadrat så att raderna, kolumnerna och diagonalerna lägger till samma nummer. Till exempel är en 3x3 magisk fyrkant:

 8 1 6

 3 5 7

 4 9 2

Varje rad, kolumn och diagonal lägger till 15.

Odd Magic Squares-fråga

Denna programmeringsövning handlar om att skapa magiska kvadrater med udda storlekar (dvs storleken på torget kan endast vara ett udda nummer, 3x3, 5x5, 7x7, 9x9, och så vidare). Tricket med att göra en sådan kvadrat är att placera nummer 1 i den första raden och den mellersta kolumnen. För att hitta var du ska placera nästa nummer, flytta diagonalt uppåt till höger (dvs en rad uppåt, en kolumn över). Om ett sådant drag betyder att du faller bort från torget, lindar du runt till raden eller kolumnen på motsatt sida. Slutligen, om flytten tar dig till en fyrkant som redan är fylld, gå tillbaka till den ursprungliga fyrkanten och flytta nedåt med en. Upprepa processen tills alla rutorna är fyllda.

Till exempel skulle en 3x3 magisk fyrkant börja så:

 0 1 0

 0 0 0

 0 0 0

En rörelse diagonalt uppåt betyder att vi sveper runt till botten av torget:

 0 1 0

 0 0 0

 0 0 2

På samma sätt betyder nästa diagonal rörelse uppåt att vi sveper runt till den första kolumnen:

 0 1 0

 3 0 0

 0 0 2

Nu leder diagonalen uppåt till en kvadrat som redan är fylld, så vi går tillbaka till dit vi kom ifrån och släpper ned en rad:

 0 1 0

 3 0 0

 4 0 2

och det fortsätter och fortsätter tills alla rutorna är fulla.

Programkrav

  • en användare måste kunna ange storleken på den magiska fyrkanten.
  • de får bara tillåtas skriva in ett udda nummer.
  • använd en metod för att skapa den magiska fyrkanten.
  • använd en metod för att visa den magiska fyrkanten.

Frågan är kan ditt program skapa en 5x5 magisk fyrkant som den nedan?

 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 

Ledtråd: Förutom programmeringsaspekterna av denna övning är det också ett test av logik. Ta varje steg för att skapa den magiska fyrkanten i tur och ordning och hur du kan göra det med en tvådimensionell matris.

Odd Magic Square Solution

Ditt program borde ha kunnat skapa 5x5 magiska fyrkanten nedan:

 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 

Här är min version:

 importera java.util.Scanner;

 public class MagicOddSquare 

 

   public static void main (String [] args) 

     Skannerinmatning = ny skanner (System.in);

     int [] [] magicSquare;

     boolean isAcceptableNumber = falsk;

     int-storlek = -1;

 

     // acceptera bara udda nummer

     medan (isAcceptableNumber == falsk)

     

       System.out.println ("Ange storlek i kvadrat:");

       SträngstorlekText = input.nextLine ();

       storlek = heltal.parseInt (sizeText);

       if (storlek% 2 == 0)

       

         System.out.println ("Storleken måste vara ett udda nummer");

         isAcceptableNumber = falsk;

       

       annan

       

         isAcceptableNumber = true;

       

     

 

     magicSquare = createOddSquare (storlek);

     displaySquare (magisk kvadrat); 

   

 

   privat statisk int [] [] createOddSquare (int-storlek)

   

     int [] [] magicSq = new int [storlek] [storlek];

     int rad = 0;

     int-kolumn = storlek / 2;

     int lastRow = rad;

     int lastColumn = kolumn;

     int matrixSize = storlek * storlek; 

 

     magicSq [rad] [kolumn] = 1;

     för (int k = 2; k < matrixSize+1;k++)

     

       // kolla om vi måste lindra till motsatt rad

       if (rad - 1 < 0)

       

         rad = storlek-1;

       

       annan

       

         rad--;

       

 

       // kolla om vi måste packa till motsatt kolumn

       if (kolumn + 1 == storlek)

       

         kolumn = 0;

       

       annan

       

         kolonn ++;

       

 

       // om denna position inte är tom, gå tillbaka till där vi

       // började och flytta en rad nedåt

       if (magicSq [rad] [kolumn] == 0)

       

         magicSq [rad] [kolumn] = k;

       

       annan

       

         rad = lastRow;

         kolumn = lastColumn;

         if (rad + 1 == storlek)

         

           v = 0;

         

          annan

         

           ro ++;

         

         magicSq [rad] [kolumn] = k;

       

       lastRow = rad;

       lastColumn = kolumn; 

     

     returnera MagicSq;

   

 

   privat statisk tomt 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 ("Den magiska konstanten är" + magicConstant);