演算法訓練 N皇后問題

2021-10-19 23:04:40 字數 1160 閱讀 7896

今天看了一道西洋棋的布局問題,碼界稱之為「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
返回值

92
show the code as follow:

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方式,先依次列舉每一行,在每一行中,再列舉當前行的每乙個元素,每次列舉完一行,就繼續向下一行列舉。根據題目規則,設計列舉過程的衝突陣列,防止皇后之間相互攻擊。而衝突陣列需要進行回溯。下面的 中,只有列 和兩個斜向衝...