DFS入門 例題

2021-09-13 02:12:51 字數 2401 閱讀 7125

以下是全網收集整理的和自己寫的部分,絕對保證dfs輕鬆入門。 

核心**:

關於dfs引數問題,什麼在變化,就把什麼設定成引數。

void

dfs()

//引數用來表示狀態

if(越界或者是不合法狀態)

return;

if(特殊狀態)

//剪枝

return ;

for(擴充套件方式)

} }

dfs全排列:

#include

#include

using

namespace

std;

int p[

10]=;

bool vis[

10]=;

int n;

void

dfs(int x)

for (

int i=

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

intmain

()

return

0;

}

在全排列的**基礎上    如果要求是順序輸出,則要剪枝,(只需要加一句**):

#include

#include

using

namespace

std;

int p[

10]=;

bool vis[

10]=;

int n;

void

dfs(int x)

for (

int i=

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

intmain

()

dfs 全排列的巧妙運用:

時間限制: 1 sec  記憶體限制: 128 mb

提交: 205  解決: 77

[提交][狀態][討論版][命題人:外部匯入]

已知 n 個整數b1,b2,…,bn

以及乙個整數 k(k<n)。

從 n 個整數中任選 k 個整數相加,可分別得到一系列的和。

例如當 n=4,k=3,4 個整數分別為 3,7,12,19 時,可得全部的組合與它們的和為:

3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

現在,要求你計算出和為素數共有多少種。

例如上例,只有一種的和為素數:3+7+19=29。

第一行兩個整數:n , k (1<=n<=20,k<n) 

第二行n個整數:x1,x2,…,xn (1<=xi<=5000000) 

乙個整數(滿足條件的方案數)。 

4 33 7 12 19

1

#include

#include

using

namespace

std;

bool

isprime

(int n)

//判斷素數

int a[

22];

int b[

22];

int p[

22];

bool vis[

22];

int n,k,sum,ans;

void

dfs(int index)

for (

int i=

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

intmain

()

//媽的,這個答案真巧妙

初學dfs:先做最最最基礎的題: 

做完了,你就入門了(絕對沒有比這更基礎的題了)

然後再做下面的題:

題型分類:

寫過這些入門題後,我們可以將dfs題分為兩大類: 

1 .地圖型:這種題型將地圖輸入,要求完成一定的任務。因為地圖的存在。使得題意清楚形象化,容易理清搜尋思路。

2 .資料型:這種題型沒有給定地圖,一般是一串數字或字母,要求按照一定的任務解題。相對於地圖型,這種題型較為抽象,需要在資料中進行搜尋。資料以陣列的形式儲存,那麼只要將陣列也當作一張圖來進行搜尋就可以了。

DFS 剪枝(經典例題)

描述 喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棍的長度都不超過50個長度單位。然後他又想把這些木棍恢復到為裁截前的狀態,但忘記了初始時有多少木棒以及木棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棍的長度都用大於零的整數表示。輸入 輸入包含多組資料,每組資料報...

深度優先搜尋(DFS)例題

dfs概念 它從某個狀態開始,不斷地轉移狀態直至無法轉移,然後回退到前一步的狀態,繼續轉移其他狀態,如此不斷重複,直至找到最終的解。解題利用的是 遞迴函式。例題 dfs 例題 給定整數a1,a2,a3.an,判斷是否能夠從中抽出幾個整數使得它們的和剛好為k int a max int n,k boo...

DFS和BFS典型例題

dfs模板 void dfs 引數用來表示狀態 if 越界或者不合法狀態 return else 全排列 include include int v 1005 a 1005 n void dfs int c else int main return0 素數環 include include int ...