Een magisch vierkant maken in java

Ik moet een programma schrijven dat een oneven getal van de gebruiker opneemt en een magisch vierkant maakt. Een magisch vierkant is een vierkant waarbij de som van elke rij, kolom en diagonaal hetzelfde is. Dit zijn de kenmerken voor het schrijven van de code:

  1. Vraag de gebruiker om een oneven nummer
  2. Maak een n bij n array.
  3. Volg deze stappen om een magisch vierkant te maken.
    A. Plaats een 1 in het midden van de eerste rij.
    B. Trek 1 van de rij af en tel er 1 . bij op
    naar de kolom.
    l. Plaats indien mogelijk het volgende nummer op die positie.
    ii. Volg deze stappen als dit niet mogelijk is.

    1. In rij -1, ga dan naar de laatste rij
    2. Als in de laatste kolom verandert in de eerste kolom
    3. Indien geblokkeerd, ga dan omlaag naar de volgende rij (vanaf oorspronkelijke positie)
    4. indien in de rechterbovenhoek, ga dan omlaag naar de volgende rij.
  4. Druk de matrix af

Ik heb de code geschreven, maar als ik hem uitvoer, voert het programma alle cijfers in behalve het nummer twee; om de een of andere reden slaat mijn programma het over. Als ik bijvoorbeeld het getal 3 als het oneven getal invoer, is mijn output:

6 1 0 
3 4 5 
9 7 8 

0 hoort daar niet te zijn, maar nummer twee wel. Hier is mijn code:

public static void main(String[] args) {
    System.out.print("Give an odd number: ");
    int n = console.nextInt();
    int[][] magicSquare = new int[n][n];
    int number = 1;
    int row = 0;
    int column = n / 2;
    while (number <= n * n) {
        magicSquare[row][column] = number;
        number++;
        row -= 1;
        column += 1;
        if (row == -1) {
            row = n - 1;
        }
        if (column == n) {
            column = 0;
        }
        if (row == 0 && column == n - 1) {
            column = n - 1;
            row += 1;
        } else if (magicSquare[row][column] != 0) {
            row += 1;
        }
    }
    for (int i = 0; i < magicSquare.length; i++) {
        for (int j = 0; j < magicSquare.length; j++) {
            System.out.print(magicSquare[i][j] + " ");
        }
        System.out.println();
    }
}

Kan iemand me vertellen waar ik de fout in ben gegaan en waarom mijn programma nummer 2 overslaat? *Dit is een huiswerkvraag, dus alleen antwoorden met code. Bedankt.


Antwoord 1, autoriteit 100%

Als u 3.4 verwijdert, wordt uw code waarschijnlijk hersteld.

public static void main(String[] args) {
    System.out.print("Give an odd number: ");
    int n = console.nextInt();
    int[][] magicSquare = new int[n][n];
    int number = 1;
    int row = 0;
    int column = n / 2;
    int curr_row;
    int curr_col;
    while (number <= n * n) {
        magicSquare[row][column] = number;
        number++;
        curr_row = row;
        curr_col = column;
        row -= 1;
        column += 1;
        if (row == -1) {
            row = n - 1;
        }
        if (column == n) {
            column = 0;
        }
        if (magicSquare[row][column] != 0) {
            row = curr_row + 1;
            column = curr_col;
            if (row == -1) {
                row = n - 1;
            }
        }
    }
    for (int i = 0; i < magicSquare.length; i++) {
        for (int j = 0; j < magicSquare.length; j++) {
            System.out.print(magicSquare[i][j] + " ");
        }
        System.out.println();
    }
}

Als ik n = 3 instel, krijg ik de volgende uitvoer die correct lijkt.

8 1 6 
3 5 7 
4 9 2 

Antwoord 2, autoriteit 97%

De logica van je vierkant zorgt ervoor dat er nooit naar de rechterbovenhoek wordt geschreven.

if in the upper right corner, then drop down to next row.

En hier is de code die het doet…

if (row == 0 && column == n - 1) {
    column = n -1;
    row += 1;

Dus je gaat altijd weg van die locatie voordat je een waarde invoert bij je volgende iteratie. Je hebt die regel die de kolom instelt op n – 1 niet echt nodig, want het is al n – 1 per definitie van de logica erboven.

Je schrijft eigenlijk de waarde 2 naar de tweede rij, derde kolom. Het wordt dan later overschreven door de waarde 5. Als u de waarden van uw array na elke iteratie van uw programma uitvoert, zult u zien hoe de status van uw model verandert.

Other episodes