2012-03-22 3 views
-1

고정 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); 

} 

}

+0

디버깅을하셨습니까? 어느 방법으로 막히게됩니까? – talnicolas

+0

행을 채우는 동안 멈추게됩니다. 대각선 방법이 맞는지는 확실합니다. 나는 그것들을 시험해 보았고 그들이 상상 한대로 일했습니다. 편집 : 답변, 그것은 (int x, int y) 행에 걸린 가져옵니다. 방법. – Mythril225

+0

글쎄, 당신이 그 재귀 호출'row (x + 1, y);를 벗어나고 있는지 확신 할 수 없다. – talnicolas

답변

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 

     } 
    } 
} 
+0

이것은 재귀 함수이므로 값을 사용하지 않으므로 뒤로 이동할 때마다 덮어 써야하므로 해제해야합니다. – Mythril225

+0

@ Mythril225 : 흠 ... 말이 되네. – LeleDumbo

0

내가 아주 오랫동안이 무한하다고 생각 해달라고하지만 :

(9) -step loop in diag1,
3-deep recrusion을 diag1,
다음 diag2diag2
-3- 깊은 재귀 9 단계 루프
다음에 rowrow
~ 6 깊은 재귀 9 단계 루프.

모든 루프가 각 반복마다 복잡한 작업을 수행하는 것은 아니지만 사각형의 "해상도"마다 사각형의 상태를 인쇄하는 것을 고려하면 몇 시간이 걸릴 수 있습니다 시간이 걸리다.