[JAVA]8皇后棋盤 - Recursion

8皇后棋盤 - Recursion

public class Queen8 {

  // 總共放置8個皇后
  int queenAmount = 8;
  int[] array = new int[queenAmount];
  static int arrayCount = 0;
  static int checkConflictCount = 0;


  public static void main(String[] args) {
    Queen8 queen8 = new Queen8();
    // 從第1個棋子(index = 0)開始放置
    queen8.placeQueen(0);
    System.out.printf("一共%d解法\n", arrayCount);
    System.out.printf("一共判斷是否衝突%d次\n", checkConflictCount);
  }

  /**
   * 放置皇后棋子
   * @param n 第n個皇后
   */
  private void placeQueen(int n) {
    if (n == queenAmount) {
      // 放置第9個皇后,代表前8個皇后已經放置完畢
      // 輸出
      print();
      return;
    }
    for (int i = 0; i < queenAmount; i++) {
      // array[n] = i 代表第n個皇后放置在該列的第i行
      array[n] = i;
      if (checkNoConflict(n)) {
        // 放置下一個皇后
        placeQueen(n + 1);
      }
    }
  }

  /**
   * 判斷棋子放置的位置是否有衝突
   * @param n 第n個皇后
   * @return true沒有衝突
   */
  private boolean checkNoConflict(int n) {
    checkConflictCount++;
    for (int i = 0; i < n; i++) {
      if (array[n] == array[i] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
        // 放置同一行 或 同一對角線 有衝突
        return false;
      }
    }
    return true;
  }


  /**
   * 輸出
   */
  private void print() {
    arrayCount++;
    for (int i = 0; i < array.length; i++) {
      System.out.print(array[i] + " ");
    }
    System.out.println();
  }
}

如有敘述錯誤,還請不吝嗇留言指教,thanks!