고정 N 차원에 대해 가능한 모든 마술 사각형을 생성 할 수있는 프로그램을 작성하려고합니다. 대각선 셀에 값을 채운 다음 값이있는 행을 채우면됩니다.Magic Square recursion infinte loop java
필자는 행을 채울 때 무한 사이클에 갇혀있는 것처럼 보이지만 방법이나 이유를 파악할 수는 없습니다. 합계 검사를 구현하지 않았으므로 행이나 열의 합계가 올바른지 여부를 확인하지만 여기서는 무효입니다.
누구든지 나를 도울 수 있다면, 나는 매우 위대 할 것입니다.
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);
}
}
디버깅을하셨습니까? 어느 방법으로 막히게됩니까? – talnicolas
행을 채우는 동안 멈추게됩니다. 대각선 방법이 맞는지는 확실합니다. 나는 그것들을 시험해 보았고 그들이 상상 한대로 일했습니다. 편집 : 답변, 그것은 (int x, int y) 행에 걸린 가져옵니다. 방법. – Mythril225
글쎄, 당신이 그 재귀 호출'row (x + 1, y);를 벗어나고 있는지 확신 할 수 없다. – talnicolas