回溯法、DFS
阿新 • • 發佈:2018-12-02
回溯法
為了求得問題的解,先選擇某一種可能情況向前探索,在探索過程中,一旦發現原來的選擇是錯誤的,就退回上一步重新選擇條件,繼續向前探索,如此反覆進行,直至得到解或證明無解。
DFS
DFS模板
void dfs(int step)
{
判斷邊界
嘗試每一種可能 for (int i=1;i<=n;i++)
{
繼續下一步 dfs(step+1);
}
返回
}
搜尋模板的套路:
先判斷是否達到目標狀態
如果達到,判斷當前狀態是否合法是否計入答案。
未達到,列舉可能的狀態,記錄本輪選擇,進入下一層。
返回後,消除影響。
例題 全排列(dfs)
#include<bits/stdc++.h> using namespace std; int n,a[100],vis[100],t; void dfs(int cur) { if (cur==n+1) { for (int k=1;k<=n;k++) cout<<a[k]; cout<<endl; t++; return ; } else { for (int i=1;i<=n;i++) { if (vis[i]==0) {a[cur]=i; vis[i]=1; dfs(cur+1); vis[i]=0; } } } } int main() { cin>>n; dfs(1); cout<<"Total="<<t; return 0; return 0; }
輸入樣例:3
輸出樣例:
123
132
213
231
312
321