題目:八皇后問題;
即在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個皇后不能處在同...