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;
}