【回溯】八皇后的方案數——經典巨無霸
阿新 • • 發佈:2020-12-25
問題描述:
皇后問題是指在8*8的棋盤上放置8個皇后,使這8個皇后無法吃掉對方(也就是說兩兩不在一行,不在一列,也不在對角線上),求放置皇后的方案數
輸入:
無
輸出:
一個整數,表示方案數
解法:回溯試探
思路
(1)用一個數組arr表示放置的方式,例如arr[i] = j表示在第i行第j列放置一個皇后,i和j均從0開始,即0表示第一行(列)
(2)一行一行的放置皇后,挨個位置進行試探,如果該位置可用,繼續進行下一行的試探,如果該位置不可用,那麼回退,將這個皇后放置到下一列
(3)直到行數等於8,方案數+1,否則繼續進行下一行的試探
程式碼
/**
* 八皇后問題
* (有多少種擺法)
*/
public class Main {
/** 放置的方案數 */
static int count = 0;
public static void main(String[] args) {
// arr[i] = j : 表示第i行j列放置了一個皇后
int[] arr = new int[8];
queen(arr,0, 8);
System.out.println(count);
}
/**
* 回溯解法
*/
private static void queen(int [] arr, int i, int n) {
if(i == n){
// 方法數加一
++ count;
return;
}else {
for (int j = 0; j < n; j++) {
// 往第i行第j列放置一個皇后
arr[i] = j;
// 判斷前面放的i行是否符合條件,如果符合,則放置下一行,如果不符合,繼續試探j + 1列
if (judge(arr, i)){
queen(arr, i + 1, n);
}
}
}
}
/**
* 判斷已經放置的皇后位置是否可行
*/
private static boolean judge(int[] arr, int i) {
for (int ii = 0; ii < i; ii++) {
// 同列 || 主斜線 || 副斜線
if(arr[i] == arr[ii] || i - ii == arr[i] - arr[ii] || i - ii == arr[ii] - arr[i]){
return false;
}
}
return true;
}
}