劍指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],則覺得有兩個元素位於了同乙個對角線上,則該排列不符合條件。
**例如以下:
#includevoid swap(int *a,int *b)
/*假設有符合條件的擺法,列印出全部的擺法,否則,什麼也不列印
*/void cubvertex(int *a,int len,int begin)
{ if(a==null || len!=8)
return;
if(begin == len-1)
{ int i,j;
bool can = true; //是否又符合條件的擺法
for(i=0;i
測試結果:
四皇后:
四皇后總共同擁有2中擺法。
1、3、0、2的意思是指:第0行上的皇后擺放在第1個位置(從0開始),第1行上的皇后擺放在第3個位置,第3行上的皇后擺放在第0個位置,第4行上的皇后擺放在第2個位置。
八皇后:
八皇后總共同擁有92種擺法。
劍指offer 八皇后問題
劍指offer上解決八皇后問題,沒有用傳統的遞迴或非遞迴回溯法,而是用了很巧妙的全排列法。先說下八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。全排列解決八皇后問題的思路如下 由於8個皇后不能處在同一行,...
劍指offer 八皇后問題
題目 在8 8的西洋棋上擺放8個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行 同一列或者同一條對角線上。請問總共有多少種符合條件的擺法?劍指offer上給出的是全排列法,解法步驟如下 1 定義陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號 2 對陣列用0 7進行初...
《劍指Offer》面試題 八皇后問題
題目 八皇后問題 即在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法 在做了前面兩道題之後,解決這道題就容易多了。思想一模一樣。全排列解決八皇后問題的思路如下 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣...