2012-03-22 109 views
-1

我正試圖編寫一個程序,可以爲固定的N維生成所有可能的幻方塊。我將通過用值填充對角線單元格然後用值填充行來解決這個問題。Magic Square遞歸無限循環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 2012-03-22 15:10:12

+0

它填滿行時卡住了。我確信對角線方法是正確的。我測試了他們,他們按照想象工作。編輯:回答,它卡在行(int x,int y);方法。 – Mythril225 2012-03-22 15:12:00

+0

嗯,我不確定你是否正在遞歸調用'row(x + 1,y);'永遠。 – talnicolas 2012-03-22 15:17:28

回答

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 2012-03-22 15:29:09

+0

@ Mythril225:嗯...有道理 – LeleDumbo 2012-03-22 15:41:05

0

我不認爲這是無限的,但很長:

9 step-loop在diag1,
3 -detelect diag1,
然後9-步驟循環中diag2
3-深遞歸在diag2
然後在rowrow
〜6深遞歸9-步驟循環。

儘管並非所有的循環都在每次迭代中執行復雜的操作,但如果您還考慮到在方塊的每個「分辨率」下打印正方形的狀態,打印到控制檯需要時間。