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