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!