Nu este clar cine a venit pentru prima dată cu un pătrat magic. Există o poveste despre o inundație uriașă în China cu mult timp în urmă. Oamenii erau îngrijorați că vor fi spălați și au încercat să potolească zeul râului făcând sacrificii. Nimic nu părea să funcționeze până când un copil nu a observat o broască țestoasă care avea un pătrat magic pe spate, care continua să încerce jertfa. Piața le-a spus oamenilor cât de mare trebuie să fie sacrificiul lor pentru a se salva. De atunci pătratele magice au fost înălțimea modei pentru orice broască țestoasă.
Nivel: Începător
Focus: Logică, Array-uri, Metode
În cazul în care nu ați întâlnit niciodată unul anterior, un pătrat magic este un aranjament de numere secvențiale într-un pătrat, astfel încât rândurile, coloanele și diagonalele să se adauge la același număr. De exemplu, un pătrat magic 3x3 este:
8 1 6
3 5 7
4 9 2
Fiecare rând, coloană și diagonală adaugă până la 15.
Acest exercițiu de programare se referă la crearea de pătrate magice de dimensiuni impare (adică, dimensiunea pătratului poate fi doar un număr impar, 3x3, 5x5, 7x7, 9x9 și așa mai departe). Trucul cu crearea unui astfel de pătrat este de a plasa numărul 1 în primul rând și coloană de mijloc. Pentru a găsi unde să plasați următorul număr, deplasați-vă în diagonală în sus spre dreapta (adică, un rând în sus, o coloană peste). Dacă o astfel de mișcare înseamnă că ai căzut din pătrat, înfășoară-te în rândul sau coloana din partea opusă. În cele din urmă, dacă mutarea te duce într-un pătrat deja umplut, du-te înapoi la pătratul inițial și deplasează-te în jos câte unul. Repetați procesul până când toate pătratele sunt completate.
De exemplu, un pătrat magic 3x3 ar începe astfel:
0 1 0
0 0 0
0 0 0
O mișcare în diagonală în sus înseamnă că ne înfășurăm în partea de jos a pătratului:
0 1 0
0 0 0
0 0 2
De asemenea, următoarea mișcare diagonală în sus înseamnă că ne înfășurăm în prima coloană:
0 1 0
3 0 0
0 0 2
Acum, diagonală mișcarea în sus rezultă într-un pătrat care este deja umplut, așa că ne întoarcem la locul de unde am venit și abandonăm un rând:
0 1 0
3 0 0
4 0 2
și continuă continuu până când toate pătratele sunt pline.
Întrebarea este dacă programul dvs. poate crea un pătrat magic de 5x5 ca cel de mai jos?
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
Aluzie: În afară de aspectele de programare ale acestui exercițiu, este și un test al logicii. Faceți fiecare pas pentru crearea pătratului magic pe rând și imaginați cum se poate realiza cu un tablou bidimensional.
Programul dvs. ar fi trebuit să poată crea pătratul magic 5x5 de mai jos:
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
Iată versiunea mea:
import java.util.Scanner;
public class MagicOddSquare
public static void main (String [] args)
Intrare scaner = Scanner nou (System.in);
int [] [] magicSquare;
boolean isAcceptableNumber = false;
dimensiune int = -1;
// acceptă doar numere impare
while (isAcceptableNumber == false)
System.out.println ("Introduceți în dimensiunea pătratului:");
String sizeText = input.nextLine ();
size = Integer.parseInt (sizeText);
if (mărime% 2 == 0)
System.out.println ("Mărimea trebuie să fie un număr impar");
isAcceptableNumber = false;
altfel
isAcceptableNumber = true;
magicSquare = createOddSquare (dimensiune);
displaySquare (pătrat magic);
private static int [] [] createOddSquare (dimensiune int)
int [] [] magicSq = nou int [mărime] [dimensiune];
rândul int = 0;
int column = size / 2;
int lastRow = rând;
int lastColumn = coloană;
int matrixSize = mărime * mărime;
magicSq [rând] [coloană] = 1;
pentru (int k = 2; k < matrixSize+1;k++)
// verificați dacă trebuie să ne înfășurați în rândul opus
if (rândul - 1 < 0)
rând = mărime-1;
altfel
rând--;
// verificați dacă trebuie să înfășurați în coloana opusă
if (coloana + 1 == mărime)
coloana = 0;
altfel
coloană ++;
// dacă această poziție nu este goală, atunci întoarceți-vă la locul unde noi
// a început și a muta un rând în jos
if (magicSq [rând] [coloană] == 0)
magicSq [rând] [coloană] = k;
altfel
rând = lastRow;
column = lastColumn;
if (rândul + 1 == mărimea)
rând = 0;
altfel
rând ++;
magicSq [rând] [coloană] = k;
lastRow = rând;
lastColumn = coloană;
returnează magicSq;
private static void displaySquare (int [] [] magicSq)
int magicConstant = 0;
pentru (int j = 0; j<(magicSq.length);j++)
pentru (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 ("Constanta magică este" + magicConstant);