Création d'un Carré Magique en java


Je dois écrire un programme qui prend un nombre impair de l'utilisateur et crée un carré magique. Un carré magique est celui où la somme de chaque ligne, colonne et diagonale est la même. Ce sont les caractéristiques pour écrire le code:

  1. Demander à l'utilisateur un nombre impair
  2. Créer un tableau n par n.
  3. Suivez ces étapes pour créer un carré magique.
    a. Placez un 1 au milieu de la première rangée.
    b. Soustraire 1 de la ligne et ajouter 1 de colonne.
    i. Si possible, placez le numéro suivant à cette position.
    ii. Si cela n'est pas possible, procédez comme suit.
    1. Si dans la ligne -1, puis passer à la dernière ligne
    2. Si dans la dernière colonne, passez à la première colonne
    3. S'il est bloqué, passez à la ligne suivante (à partir de la position d'origine)
    4. si vous êtes dans le coin supérieur droit, passez à la ligne suivante.
  4. Affiche le tableau

J'ai écrit le code mais quand je cours c', le programme met dans tous les numéros, sauf pour le nombre deux; pour une raison quelconque, mon programme saute. Par exemple, si je mets le nombre 3 comme nombre impair, ma sortie est:

6 1 0 
3 4 5 
9 7 8 

0 n'est pas censé être là mais le nombre deux l'est. Voici mon 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();
    }
}

Quelqu'un pourrait-il me dire où je me suis trompé et pourquoi mon programme saute le numéro 2? * Ceci est une question de devoirs, donc le code ne répond que, s'il vous plait. Grâce.

Author: Marv, 2016-03-16

2 answers

Supprimer 3.4 corrigera probablement votre 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;
    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();
    }
}

Le réglage n = 3 me donne la sortie suivante qui semble correcte.

8 1 6 
3 5 7 
4 9 2 
 3
Author: Brendan, 2016-03-16 16:01:36

La logique de votre carré garantit que le coin supérieur droit n'est jamais écrit.

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

Et voici le code qui le fait...

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

Donc, vous allez toujours vous éloigner de cet emplacement avant d'entrer une valeur lors de votre prochaine itération. Vous n'avez pas réellement besoin de cette ligne qui définit la colonne sur n - 1 car elle est déjà n - 1 par définition de la logique au-dessus.

Vous écrivez en fait la valeur 2 sur la deuxième ligne, la troisième colonne. Il est alors plus tard écrasé par la valeur 5. Si vous affichez les valeurs de votre tableau après chaque itération de votre programme, vous verrez comment l'état de votre modèle change.

 6
Author: ManoDestra, 2016-03-16 15:51:09