-1

こんにちは、Java で魔方陣プログラムを作成しました。数値 3 を入力すると正常に動作しますが、5 などを入力すると問題が発生します。パターンが間違っています。

私のコードで何が間違っているかを見つけるのを手伝ってください:

これが私のコードです:

    Scanner input = new Scanner(System.in);

    System.out.print("Enter a number: ");
    int num = input.nextInt();

    // Number must be ODD and not less than or equals to one to continue
    while ((num % 2 == 0) || (num <= 1)) {
        System.out.println("Enter a valid number: ");
        num = input.nextInt();
    }

    int[][] magic = new int[num][num];

    int row = 0;
    int col = num / 2;
    magic[row][col] = 1;

    for (int i = 2; i <= num * num; i++) {
        if (magic[(row + 5) % num][(col + 2) % num] == 0) {
            row = (row + 5) % num;
            col = (col + 2) % num;
        } else {
            row = (row + 1 + num) % num;
        }
        magic[row][col] = i;
    }

    for (int x = 0; x < num; x++) {
        for (int j = 0; j < num; j++) {
            System.out.print(magic[x][j] + "\t");
        }
        System.out.println();
    }

}

3を入力すると正しいです。出力は次のとおりです。

ここに画像の説明を入力

しかし、5: のような数字を入力すると、次のようになります。

ここに画像の説明を入力

更新しました!

4

1 に答える 1

1

奇数次数の魔方陣を構築する方法を実装しようとしているようです。

この方法では、最初の行の中央の列から番号 1 を開始するように規定されています。

あなたにはその権利があるようです。

その後、マスを埋めるための基本的な動きは、斜め上と右に一歩ずつです。

これを次のようにコーディングします。

int newRow = row - 1;
int newCol = col + 1;

「上および右へ」の動きが正方形を離れる場合、それぞれ最後の行または最初の列にラップされます。

これは明らかに:

if ( newRow < 0 ) {
  newRow = num - 1;
}
if ( newCol > num - 1 ) {
  newCol = 0;
}

塗りつぶされた正方形に遭遇した場合は、代わりに 1 つ下の正方形に垂直に移動し、その後は以前と同様に続行します。

if (magic[newRow][newCol] != 0) {
  newRow = row + 1;
  newCol = col;
}

これで実際に問題が解決するわけではないことはわかっていますが、目標に向かってどこかに到達できることを願っています. アルゴリズムの単語をどのように取得し、それらをコードで可能な限り正確に一致させるかをご覧ください。

于 2014-12-10T16:54:20.663 に答える