劍指offer 八皇后問題

2021-06-22 04:25:56 字數 1146 閱讀 5107

劍指offer上解決八皇后問題,沒有用傳統的遞迴或非遞迴回溯法,而是用了很巧妙的全排列法。

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

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

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

**如下:

[cpp]view plain

copy

#include

void

swap(

int*a,

int*b)  

/*如果有符合條件的擺法,列印出所有的擺法,否則,什麼也不列印

*/void

cubvertex(

int*a,

intlen,

intbegin)  

//有符合的擺法,就列印出來

if(can)  

}  else

}  }  int

main()  

;  cubvertex(a,8,0);  

return

0;  

}  

測試結果:

四皇后:

四皇后總共有2中擺法。

1、3、0、2的意思是指:第0行上的皇后擺放在第1個位置(從0開始),第1行上的皇后擺放在第3個位置,第3行上的皇后擺放在第0個位置,第4行上的皇后擺放在第2個位置。

八皇后:

劍指offer 八皇后問題

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

劍指offer 八皇后問題

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

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

題目 八皇后問題 即在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法 在做了前面兩道題之後,解決這道題就容易多了。思想一模一樣。全排列解決八皇后問題的思路如下 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣...