程式設計之美之八皇后問題

2021-08-11 04:19:38 字數 1207 閱讀 3966

問題描述 :

八皇后問題

是乙個以

西洋棋

為背景的問題:如何能夠在8×8的西洋棋棋盤上放置八個

皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的

n皇后擺放問題

:這時棋盤的大小變為n×

n,而皇后個數也變成n。

當且僅當

n= 1或

n≥ 4時問題有解;

解題思路:回溯法

(英語:backtracking

)是暴力搜尋法

中的一種。

在經典的教科書中,八皇后問題展示了回溯法的用例。(八皇后問題是在標準西洋棋棋盤中尋找八個皇后的所有分布,使得沒有乙個皇后能攻擊到另外乙個。)

回溯法採用試錯的思想,它嘗試分步的去解決乙個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。回溯法通常用最簡單的遞迴方法來實現,在反覆重複上述的步驟後可能出現兩種情況:

在最壞的情況下,回溯法會導致一次複雜度為指數時間的計算。

(1)非遞迴回溯:

核心**如下:

void queen()      //n皇后程式  

else

} if(a[i] == initial) //第i行沒有找到可以放置皇后的位置

} if (i == queen - 1) //最後一行找到了乙個皇后位置,說明找到乙個結果,列印出來

++i; //繼續探測下一行的皇后位置

} }

非遞迴回溯的主要思想就是判斷何時回溯。

條件判斷:

int valid(int row, int col)    //判斷第row行第col列是否可以放置皇后  

return 1;

}

(2)遞迴回溯

核心**:

int find(int i,int k)    

} }

}

1,維基百科回溯法

2,維基百科八皇后問題

3,   n皇后的兩個高效解法

重新開始戰鬥17 程式設計之美 八皇后問題

申明 八皇后問題沒有被 程式設計之美 收錄,和 重新開始戰鬥16 程式設計之美 判斷鍊錶是否有環 一樣,筆者也在面試時多次遇到這樣的問題,因此在這裡和大家分享。八皇后遊戲的說明 問題的提出 八皇后是個古老而有趣的遊戲,是由高斯於1850年首先提出的。要求在西洋棋的棋盤上放置八個皇后,使其不能相互攻擊...

程式設計之美之烙餅問題

程式設計之美之一摞烙餅.cpp 定義控制台應用程式的入口點。不同的程式會得到不同的結果嗎?有個程式能得到不同的結果,但後來證明他的結果是錯的 該演算法有點在於在於找最少的交換次數,不是在於用最少的時間進行排序,此演算法的排序時間不是最少的。因為演算法的查詢時間太長了。include stdafx.h...

《程式設計之美》之買書問題

這兩天剛看 程式設計之美 裡面的一些演算法有些確實經典,非常的感興趣,很喜歡自己先思考一下,然後看看書上的解析。對於1.4節的買書的問題,原書的解法二我看得不是很明白,而且解法一通過區域性最優解得到全域性最優解,這個肯定是不可取的,以下是我個人對這個問題的解法。本數 2 折扣 5 本數 3 折扣 1...