關於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 ...