劍指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個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣...