n皇后:遞迴思想之解決多重迴圈
圖一:8皇后問題
通過題目我們可以很明顯的發現,每行有且只有乙個皇后,這樣我們就可以採用乙個一維陣列表示n個皇后在棋盤上的擺放位置(例如a[1]=2,表示第一行的皇后擺放在第二列),這樣我們就可以假設,已經有k個皇后無錯的擺放好了,現在我們需要對k+1行的皇后進行放置,如何放?
我們從k+1的第一列開始進行遍歷,這時候就會產生兩種情況:
1:第k+1行找到乙個位置可以擺放皇后(即這個位置與前n行的所有皇后不發生衝突)
2:第k+1行沒有乙個位置可以擺放皇后。
當出現第一種情況時我們知道k+1行的皇后已經擺放好了,我們這是後就可以在次呼叫這個函式來處理k+2行的皇后如何擺放。(遞迴呼叫)
當第二種情況發生時我們知道前面k行皇后的擺放是不可行的,這時候我們就需要回到第k行為第k行的皇后重新選擇乙個位置。(回溯思想)
#include#include using namespace std;
bool decide(const int *a,const int k) {
for(int j=0;j>n;
int *a = new int[n];//注意初始化
for(int i=0;i現在我們已經使用計算機解決了基本問題但已久有更大的問題等著我們:
位運算實現n皇后問題
還可以有其他方法比如是否可以設定乙個標籤列表,裡面存放著可以放置的位置,每次放置皇后後更新標籤列表(可以使用map來實現)
今天我們**了遞迴思想的另一種用法:解決n重迴圈問題。與迭代思想不同,遞迴不需要我們從第一步開始考慮,而是先假設已經完成了n步,第n+1步應如何完成。遞迴思想的重點在於,整個遞迴函式的出口如何設定。
最近看了一本書《小王子》,感悟頗深;讓人不由的想起那朵長著「利爪」的,嬌弱的,散發著香味的玫瑰,倘若還能再找到這支玫瑰花。。。。。。。。哈哈,上帝會眷顧乙個人兩次嗎?
我那時什麼也不懂!我應該根據她的行為,而不是根據她的話來判斷她。 她使我的生活芬芳多彩,我真不該離開她跑出來。我本應該猜出在她那令人愛憐 的花招後面所隱藏的溫情。花是多麼自相矛盾!我當時太年青,還不懂得愛她。
我是作者 賣女孩的小火柴,希望大家點讚關注。
八皇后時間複雜度 回溯 N皇后問題
在n n格的棋盤上放置彼此不受攻擊的n個皇后。由於皇后可以攻擊與之處於同一行或同一列或在同一斜線上的棋子。n皇后問題等價於在n n的棋盤上放置n個皇后,任何兩個皇后不放在同一列或同一行或同一斜線上。解法分析 最粗暴的做法是每一行遍歷列,然後每次和前面的所有元素判斷一下是不是互相攻擊。複雜度太高。df...
八皇后時間複雜度 九章演算法 N皇后問題
n皇后問題是將n個皇后放置在n n的棋盤上,皇后彼此之間不能相互攻擊 任意兩個皇后不能位於同一行,同一列,同一斜線 給定乙個整數n,返回所有不同的n皇后問題的解決方案。每個解決方案包含乙個明確的n皇后放置布局,其中 q 和 分別表示乙個女王和乙個空位置。樣例1 輸入 1 輸出 q 樣例2 輸入 4 ...
八皇后時間複雜度 回溯 八皇后問題分析和實現(上)
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。1.第乙個皇后先放一行一列 2.第二個皇后放在第二行第一列,然後判...