N皇后問題的一般解法 回溯法

2021-07-05 03:40:39 字數 1279 閱讀 7600

先上**

#include #include #include #include using namespace std;

vectorboard;

void showqueen(void)

cout << endl;

}bool isvalid(int rows, int cols, int order)

return true;

}int queenmutex(int k)

else

}else

}} return solutions;

}int main(int argc, char const *argv)

} board.assign(order, 0);

int n = queenmutex(order);

cout << "solutions: " << n << endl;

return 0;

}

可以由引數指定要解決問題的規模n,我在ubuntu14.04 64bitos下模擬出來,一共有92個解,時間10ms左右。

問題需求描述:在乙個n×n的二維棋盤內,每行放置乙個皇后,使得他們不能相互攻擊。

轉化:由皇后的走法規則直接將問題直接轉化為任意兩個皇后不能在同一行或同一列或任意45°角斜線上。

思考的問題1:棋盤和皇后的位置怎麼表示?

之前一直想的是用乙個n*n的二維陣列表示,畢竟這樣比較直觀。後來發現這樣不僅浪費空間,而且也會浪費時間。

一種比較好的辦法是:用乙個1×n的1維陣列表,第i行的元素的值表示該行皇后所在的位置,行與行之間自然分開。

全域性容器board用來存放皇后的位置。

思考的問題2:思路

利用窮舉法和回溯法,將每一種可能的組合都嘗試一邊,符合要求的就輸出,否則回到上一行皇后的下乙個位置開始繼續嘗試。因此只要寫出判斷乙個皇后的位置是否合法,即可比較清晰地理解思路。該函式為bool isvalid(int rows, int cols, int order);若該皇后符合要求,將其位置放到相應的board元素中board[row] = col; 並判斷皇后是否已經全部放置好,若是則輸出,進而再回到上一行嘗試其他組合(line45---50),若不是,則將row加1,進入下一行的判斷。若該皇后不符合要求, 將列數加1,繼續判斷。同時要判斷是否到達邊界,若是則返回上一行繼續嘗試(line61---64)。這就是所謂的回溯。本題中由於要找到所有的解,所以不管是找到滿足要求的解,還是發現當前組合不能滿足時,都要進行回溯。如果只要求找到一種解,則對前一種情況返回即可,而後一種情況仍需回溯。

回溯法 n皇后 python 解法二

普通的用二維陣列解決 這兒採用一維陣列,即行數作為index,而列數代表array index 輸出所有的解 global n 皇后個數 global x 當前解 list型別不需要宣告為全域性變數!global sum 當前已找到的可行方案數 n 4 x 0 for i in range n su...

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...

回溯法 n皇后問題

問題描述 在nxn的棋盤上,放置彼此不受攻擊的n個皇后。規則 皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。以行為主導 不用再判斷是否同行了 演算法設計 1 定義問題的解空間 問題解的形式為n元組 分量xi表示第i個皇后放置在第i行,第xi列。2 解空間的組織結構 m叉樹 3 搜尋解空間 約束...