這個講回溯套路的不錯
我起初的思路思路修正
我在列舉選擇時,規避了行和列的衝突,前面畫的搜尋樹已經是修剪後的。
但我還是想複雜了,對角線衝突和行列衝突一起作為約束就好,直接進行充分剪枝。
即遍歷之前的行,如果當前的格仔和之前的皇后們 同列或同對角線,則跳過該點(這需要優化,後面會講)
你看上圖左邊兩個葉子節點,下一行怎麼放都衝突,可選的選項都被剪完了,
當所有可選的選擇迭代完,當前遞迴分支就結束,撤銷最後的選擇,回到上一層,切入另乙個分支。
當填完第四行,如上圖的綠鉤,生成了乙個解,加入解集,並返回(這裡不返回也行,因為已經做了充分的剪枝,不返回就會走一遍迭代,遞迴也結束),開始回溯,繼續尋找完整解。
選擇,決定了搜尋空間,決定了搜尋空間有哪些節點。
約束,用來剪枝,避免進入無效的分支。
目標,決定了什麼時候捕獲有效的解,提前結束遞迴,開始回溯。
遍歷列舉出所有可能的選擇(回溯問題可能乍看都有些複雜,考慮個簡單的情況,不要吝嗇畫圖,樹形圖之類的幫助理清思路。
選擇,決定了搜尋空間,決定了搜尋空間有哪些節點。依次嘗試這些選擇:(不同的題,選擇方法不一樣,可以是修改狀態,壓入陣列,交換順序,標記等等)
作出一種選擇,並往下遞迴。
約束,用來剪枝,避免進入無效的分支。如果這個選擇產生不出正確的解,要撤銷這個選擇(將當前的 「q」 恢復為 「.」),回到之前的狀態,並作出下乙個可用的選擇。
目標,決定了什麼時候捕獲有效的解,提前結束遞迴,開始回溯。是乙個選擇、探索、撤銷選擇的過程。識別出死胡同,就回溯,嘗試下乙個點,不做無效的搜尋。不同的題,可能選擇,約束,目標三點有所變化
從N 皇后問題看回溯法
使用遞迴 1 include 2 include 3 include 4 include 5 6 intc 0 7 8 intprint queens int queens,intn 9 18 printf 19 20 for j j n j 21 24 printf n 25 26return0 ...
n皇后(回溯)
題目描述 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。輸入測試資料由多組測試樣例組成。每組測試資料第一行輸入乙個正整數 n 1 n 10 輸出輸出有多少種合...
回溯 n皇后問題
思想 用回溯方法求解,首先要分析問題的求解空間。可用一棵n叉樹表示這個問題的求解空間,在回溯遍歷這個課二叉樹的過程中形成合理的解。對於這棵n叉樹,列序號i 0 n 1 是它的孩子,而每個孩子都有深度為n的子樹 包括自身 這些子樹的層次是n個皇后 也代表每個皇后的行序號,因為不同的皇后肯定不在同一行 ...