今天看了一道西洋棋的布局問題,碼界稱之為「n皇后」問題,十分有趣。採用遞迴思想,不斷探索和回溯,解法暴力之極。這裡分享當棋盤不大的時候,基礎的n皇后問題實現**。思路藏在注釋裡面啦~
主要是校驗的時候有兩點比較重要:
不同行和不同列就是說,arr[i]不能等於arr[a],因為一行只能放乙個,一列只能放乙個。
不在同一條斜線上就是說,|i-a|不能等於|arr[i]-arr[a]|
n皇后問題是指在n∗n的棋盤上要擺n個皇后(1<=n<=14)
要求:任何兩個皇后不同行,不同列也不在同一條斜線上,求給乙個整數nn,返回n皇后的擺法數。
示例1
輸入
1返回值
1示例2 輸入
返回值8
show the code as follow:92
package math;
import org.junit.test;
/** * n皇后問題的實現
* @author jsyuger
* 用乙個一維陣列arr[i],陣列下標i表示皇后放置的行號,arr[i]的值表示皇后放置的列號
* 通過不斷地探索與回溯,採用遞迴的思維,試驗出n*n的棋盤是否滿足n皇后的布局
*/public class nqueen
/*** 探索與回溯
* @param array 放置皇后的陣列
* @param j 放置皇后的行號
* @param n 總的棋盤行(列)數
* @return
*/public int traceback(int array , int j ,int n) {
if(j>=n) result++; // 已經放到最後一行,且最後一行放完滿足條件
else {
for(int k = 0; k這道演算法題十分消耗cpu,14個皇后的時候已經需要好幾秒,15個皇后我的辣雞pc已經在響了,時間消耗幾乎是指數級增長。資料比較大的時候,網路上大神們都提倡先進行打表操作,即先進行必要的耗效能計算再完成整個程式的設計。
演算法 n皇后問題
題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...
(演算法)N皇后問題
八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。1 回溯法 資料結構 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a 8 陣列中第i個數字,即a i 表示位於第i行的皇后的列...
演算法 n皇后問題
解題思路 這是一道非常經典的dfs問題,只需要從頭依次列舉各個情況即可。這樣設計dfs方式,先依次列舉每一行,在每一行中,再列舉當前行的每乙個元素,每次列舉完一行,就繼續向下一行列舉。根據題目規則,設計列舉過程的衝突陣列,防止皇后之間相互攻擊。而衝突陣列需要進行回溯。下面的 中,只有列 和兩個斜向衝...