1. ホーム
  2. java

[解決済み】javaでマジックスクエアを作成する

2022-02-09 10:48:52

質問内容

ユーザーから奇数を受け取り、マジックスクエアを作成するプログラムを書かなければなりません。マジックスクエアとは、各行、列、対角線の和が同じになるものである。以上がコードを書く上での特徴である。

<ブロッククオート
  1. ユーザーに奇数を求める
  2. n×nの配列を作成する。
  3. 以下の手順で、マジックスクエアを作成します。
    a. 1行目の中央に1を配置します。
    b. 行から1を引き、1を足す を列挙します。
    i. 可能であれば、その位置に次の数字を配置します。
    ii. 不可能な場合は、以下の手順に従います。
    1. 1行目にある場合は、最後の行に変更します。
    2. 最後の列の場合、最初の列に変更する
    3. ブロックされている場合は、(元の位置から)次の行にドロップダウンします。
    4. 右上にある場合は、次の行にドロップダウンします。
  4. 配列を表示する

コードを書きましたが、実行すると、プログラムは2という数字を除いてすべての数字を入れます。なぜか、私のプログラムは2をスキップしてしまうのです。例えば、奇数の数字として3を入れると、私の出力はこうなります。

6 1 0 
3 4 5 
9 7 8 

0はないはずなのに、2という数字がある。以下は私のコードです。

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();
    }
}

どこで間違ったのか、なぜ私のプログラムは2をスキップするのか、誰か教えてください。*これは宿題のようなものなので、コードのみの回答でお願いします。ありがとうございます。

どのように解決するのですか?

3.4を削除すれば、おそらくあなたのコードは修正されるでしょう。

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();
    }
}

n = 3 にすると、次のような出力が得られ、正しいと思われます。

8 1 6 
3 5 7 
4 9 2