DFS(深度優先搜尋)
簡介
深度優先搜尋(DFS,Depth-First Search)是搜尋的手段之一。它從某個狀態開始,不斷的轉移狀態直到無法轉移。然後退回到前一步的狀態,繼續轉移到其他狀態,如此不斷地重複直到找到最後的解。
樣例一
題目
部分和問題
給定整數a1,a2----an,判斷是否可以從中選出若干數,判斷是否存在幾個數或某個數和恰為k
分析
對於本題來說只需判斷兩種狀態加與不加,如果此狀態滿足和為k返回sum==k
程式碼 O(2 ^n)
//輸入
int a[MAX_N];
int n,k;
bool dfs(int i , int sum){
if (sum == k) return sum == k; //如果和為k返回
//不加上a[i]
if(dfs(i+1,sum)) return ture;
// 加上a[i]
if(dfs(i+1),sum+a[i]) return ture;
// 不能湊成k就返回false
return flase;
}
void solve(){
if(dfs(0,0)) cout << "Yes" <<endl;
else cout << "No" ;
}
樣例二
Acwing 842. 排列數字
給定一個整數 nn,將數字 1∼n1∼n 排成一排,將會有很多種排列方法。
現在,請你按照字典序將所有的排列方法輸出。
輸入格式
共一行,包含一個整數 nn。
輸出格式
按字典序輸出所有排列方案,每個方案佔一行。
資料範圍
1≤n≤71≤n≤7
輸入樣例:
3
輸出樣例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
程式碼
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10 ;
int path[N]; //表示路徑
bool use[N]; // 判斷數字是否被用過
int n ;
void dfs(int x)
{
if (x == n) { //若找到的數字位數等於所需,直接輸出結果
for (int i = 0; i < n; i ++ ) cout << path[i] << " " ;
cout << endl ;
return ;
}
for (int i = 1; i <= n; i ++ ) { // 從 i = 1 開始尋找
if (!use[i]){ //如果i 沒有被用過時
path[x] = i ; // 將 i 賦給 path
use[i] = 1 ; // 標記i被用過了
dfs(x + 1); // 尋找下一個數
use[i] = 0 ; // 尋找完恢復i
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}