中階演算法 dfs 回溯(4)

2021-10-23 17:11:37 字數 1120 閱讀 1320

這次我們來看看n皇后問題,這又是典型的dfs例題。

八皇后問題的分解一共有兩步:

生成問題的所有候選解空間

過濾掉那些不滿足要求的

細化這兩步,需要認識到下面兩點:

八皇后所有候選解空間是: [1,2,3,4,5,6,7,8] 這個集合中元素的全排列

(這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫、豎方向上攻擊的問題)

接下來八皇后相互攻擊的問題就是:任意兩個皇后是否在一條對角線上,即兩個皇后所在直線的斜率絕對值是否為1 。

清楚了上述兩點後,**就變得異常清晰、簡單、直接了,要做的工作就是:生成 [1,2,3,4,5,6,7,8] 的全排列

判斷斜率,並且過濾掉那些有衝突的解。

**如下:

#include

using

namespace std;

int n,a[15]

,b[15

],ans;

void

output()

}}if(ans>0)

ans++

;for

(int i=

1;i<=n;i++)}

void

dfs(

int num)

if(num>n)

for(

int i=

1;i<=n;i++)}

}int

main()

有一種說法,即用全排列解決x皇后問題是非常好的思路,那麼為什麼不直接用全排列函式來解決呢,我查了一下,全網沒有直接用全排列函式來解決x皇后類問題的**,於是在幾次嘗試後,我終於成功碼出了用全排列函式直接秒殺x皇后類問題的**,具體**如下:

#include

using

namespace std;

int a[15]

;int

main()

do}}if

(p==1)

break;}

}while

(next_permutation

(a+1

,a+n+1)

);return0;

}

中階演算法 dfs 回溯(1)

其實我們在遞迴演算法的學習過程中已經認識到了很多遞迴的思想,而遞迴的思想和dfs是非常相似的,不同的是在dfs中一般需要乙個標記過程也就是回溯,這裡我們練習乙個類似dfs的遞迴題。從現在開始實現從遞迴向dfs 回溯的過渡。include include include include include...

dfs與回溯演算法

1,區別不在於回溯,因為dfs也會回溯,而是dfs會將已經訪問過的點標記為不可再次連線,不會再撤銷,從而使得可搜尋路徑越來越少,而回溯會在訪問初標記,回溯時撤銷。使用鄰接鍊錶的dfs的時間複雜度為v e 2,如果在尋徑中保留stack,我們會發現dfs只會找到一條a到b的路徑,而回溯法可以找到所有的...

演算法 回溯演算法套路(dfs)

解決乙個回溯問題,本質是乙個決策樹的遍歷 三要素 1.路徑 已經做出的選擇 2.選擇列表 當前可以做的選擇 3.結束條件 到達決策樹底層,不用再做選擇 演算法框架 result def backtrack path,choicelist if 滿足結束條件 result.push back path...