《劍指Offer》面試題 八皇后問題

2021-07-05 17:17:23 字數 1157 閱讀 3062

題目:八皇后問題;

即在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法

在做了前面兩道題之後,解決這道題就容易多了。思想一模一樣。

全排列解決八皇后問題的思路如下:

由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列arr[8],此陣列的下標用來表示皇后所在的列(即陣列的下標唯一保證了皇后不同列),而此陣列中第i個元素值,即a[i]表示位於第i行的皇后的行號。先把陣列a[8]分別用0-7初始化,接下來對該陣列做全排列,由於我們用0-7這7個不同的數字初始化陣列,因此任意兩個皇后肯定也不同行,那麼我們只需要判斷每個排列對應的8個皇后中是否有任意兩個在同一對角線上即可,即對於陣列的兩個下標i和j,如果j-i==a[j]-a[i]或j-i==a[i]-a[j],則認為有兩個元素位於了同乙個對角線上,則該排列不符合條件
實現**如下:

/*八皇后問題:用排列來解決*/

#include#include#define n 8

/*函式功能:判斷八皇后的位置是否在對角線上

引數的說明:

@param arr:是乙個長度為8的陣列,陣列的下標代表皇后在8*8中的列數,而陣列中的元素值代表皇后所站的行數。

返回值:false表示八皇后不在對角線上,true表示在對角線上

*/bool isdiagonal(int *arr,int

len)

for(int i=0;i

-1;i++)

for(int j=i+1;j

}return

false;

}void swap(int *a,int *b)

int temp=*a;

*a=*b;

*b=temp;}/*

函式的功能,利用遞迴來得到全部的組合

*/void eightqueen(int *arr,int

len,int begin)

if(begin==len

-1)

printf("\n");}}

else

}}int main(void)

執行結果如下

劍指offer 八皇后問題

劍指offer上解決八皇后問題,沒有用傳統的遞迴或非遞迴回溯法,而是用了很巧妙的全排列法。先說下八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。全排列解決八皇后問題的思路如下 由於8個皇后不能處在同一行,...

劍指offer 八皇后問題

題目 在8 8的西洋棋上擺放8個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行 同一列或者同一條對角線上。請問總共有多少種符合條件的擺法?劍指offer上給出的是全排列法,解法步驟如下 1 定義陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號 2 對陣列用0 7進行初...

劍指offer 八皇后問題

劍指offer上解決八皇后問題,沒實用傳統的遞迴或非遞迴回溯法,而是用了非常巧妙的全排列法。先說下八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即隨意兩個皇后不得處於同一行,同一列或者允許對角線上,求出全部符合條件的擺法。全排列解決八皇后問題的思路例如以下 因為8個皇后不能處在同...