1. 程式人生 > 其它 >【回溯】八皇后的方案數——經典巨無霸

【回溯】八皇后的方案數——經典巨無霸

技術標籤:五大常用演算法dfs演算法

問題描述:

皇后問題是指在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; } }

執行結果