-1

固定 N 次元に対して可能なすべての魔方陣を生成できるプログラムを作成しようとしています。対角線のセルに値を入力してから、行に値を入力します。

行を埋めるときに無限サイクルで立ち往生しているようですが、その方法や理由がわかりません。行または列の合計が正しいかどうかをチェックする合計チェックは実装していませんが、ここでは関係ありません。

誰かが私を助けることができれば、私はとても素晴らしいです。コードベロー

public class Magic {

public static final int DIMENSION = 3;
public static final int DIMSQ = DIMENSION * DIMENSION;
public static int[][] array = new int[DIMENSION][DIMENSION];
public static boolean[] boolArray = new boolean[DIMENSION * DIMENSION];
public static final int sum = (DIMENSION * (DIMENSION * DIMENSION + 1)) / 2;

/*
 * Inicializaljuk a matrixunkat, illetve a boolean matrixunkat
 * Initializes the matrix and boolArray with values.
 */
public static void init() {
    for (int e[] : array) {
        for (int e2 : e) {
            e2 = 0;
        }
    }
    for (boolean e : boolArray) {
        e = false;
    }
}

/*
 * Ki irassa a matrix jelenlegi allapotat konzolra
 * Prints the array out to the console.
 */
public static void print() {
    for (int i[] : array) {
        for (int j : i) {
            System.out.print(j + ",");
        }
        System.out.println();
    }
    System.out.println();
}

/*
 * feltolti a foatlot adatokkal, majd meghivja a diagonal2-t
 * fills diagonal cells with values
 */
public static void diagonal1(int x) {

    for (int i = 0; i < DIMSQ; i++) {
        if (!boolArray[i]) {
            boolArray[i] = true;
            array[x][x] = i + 1;
            if (x < DIMENSION - 1) {
                diagonal1(x + 1);
            } else
                diagonal2(0);
            boolArray[i] = false;
        }
    }

}

/*
 * feltolti a mellekatlot adatokkal, majd meghivja a row(0,0,0)-t
 * fills diagonal cells with values
 */
public static void diagonal2(int x) {

    for (int i = 0; i < DIMSQ; i++) {
        if (!boolArray[i]) {

            if (array[DIMENSION - 1 - x][x] == 0) {
                boolArray[i] = true;
                array[DIMENSION - 1 - x][x] = i + 1;
            }
            if (x < DIMENSION - 1) {
                diagonal2(x + 1);
            } else
                row(0, 0);
            boolArray[i] = false;
        }
    }
}
/*
 * feltolti a sorokat adatokkal
 * fills rows with values
 */
public static void row(int x, int y) {
    for (int i = 0; i < DIMSQ; i++) {
        if (!boolArray[i]) {

            if (array[x][y] == 0) {
                boolArray[i] = true;
                array[x][y] = i;
            }

            if (x < DIMENSION - 1) {
                row(x + 1, y);
            } else if(y < DIMENSION - 1) { 
                row(0,y+1);
            } else print();

            boolArray[i] = false;

        }
    }
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    init();
    print();
    diagonal1(0);

}

}

4

2 に答える 2

0

私の容疑者はrow()方法です(以下の私のコメントを参照してください):

public static void row(int x, int y) {
    for (int i = 0; i < DIMSQ; i++) {
        if (!boolArray[i]) {

            if (array[x][y] == 0) {
                boolArray[i] = true; // <-- this one
                array[x][y] = i;
            }

            if (x < DIMENSION - 1) {
                row(x + 1, y);
            } else if(y < DIMENSION - 1) { 
                row(0,y+1);
            } else print();

            boolArray[i] = false; // <-- would be OVERWRITTEN by this one

        }
    }
}
于 2012-03-22T15:21:01.217 に答える
0

無限ではないと思いますが、非常に長いです:

の 9 ステップ ループ、 へdiag1
3 深さの再帰、次に の 3 深さの再帰のdiag19 ステップ ループ、そして の 6 深さの再帰の9 ステップ ループ。
diag2
diag2
row
row

すべてのループが反復ごとに複雑な操作を実行するわけではありませんが、四角形の「解像度」ごとに四角形の状態を出力することを考慮すると、これは簡単に数時間に及ぶ可能性があります。コンソールへの出力には時間がかかります。

于 2012-03-22T20:23:35.403 に答える