2012-03-22 95 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-步骤循环。

尽管并非所有的循环都在每次迭代中执行复杂的操作,但如果您还考虑到在方块的每个“分辨率”下打印正方形的状态,打印到控制台需要时间。