1. 程式人生 > >回溯法、DFS

回溯法、DFS

回溯法

為了求得問題的解,先選擇某一種可能情況向前探索,在探索過程中,一旦發現原來的選擇是錯誤的,就退回上一步重新選擇條件,繼續向前探索,如此反覆進行,直至得到解或證明無解。

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