類似於樹的先根遍歷。就是不撞南牆不回頭
模板一:
dfs(dep,..)//dep代表目前dfs的深度
dfs(dep+1,..)//列舉下一種情況
}模板二:
dfs(dep,..)
}
1.從圖中v0出發,訪問v0。
2.找出v0的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直至剛訪問過的頂點沒有未被訪問的鄰接點為止。
3.返回前乙個訪問過的仍有未被訪問鄰接點的頂點,繼續訪問該頂點的下乙個未被訪問領接點。
4.重複2,3步驟,直至所有頂點均被訪問,搜尋結束。
v0->v2->v4->v6->v1->v5->v3
已知乙個數n,將數字1~n圍成乙個圓環,要求: 相鄰兩個數之和為素數。0
輸出:
每次遞迴前判斷前兩個數之和是否為素數,因為是環,最後乙個數和第乙個數也要滿足
dfs前可以先用素數篩,求50內的素數,n最大20,最大的兩個素數和<50
#includeusing namespace std;
const int max=50;
int prime[25];//素數陣列
bool vis[25]; //訪問陣列
int n;// 個數
int ans[max];//解答輸出陣列
void prime_set() //篩法求素數
prime[1] = 0,vis[1]=true;//1雖然不是素數,但在此假設為0,將vis[1]設為true即不會遍歷到1
}void dfs(int depth)
return 1;
} void dfs(int x,int y)//x表示差幾個數,y表示選到a[y]
}}
int main()
,dy[4]=;//方向向量
for(int m=0;m<4;m++)
}matrix[i][j]=t;//回溯
return false;
}};
小明現在在玩乙個遊戲,迷宮是乙個n*m的矩陣。
小明的起點在地圖中用「s」來表示,終點用「e」來表示,障礙物用「#」來表示,空地用「.」來表示。
小明想要知道,現在他能否從起點走到終點
樣例輸入
3 3
s....e
...3 3
s#####
##e
樣例輸出yes
no
ac**
#includeusing namespace std;
int n,m,flag=0,a,b;//flag是標記能否到達
const int max=510;
char s[max][max];
int dx=, dy=;//方向向量
void dfs(int i,int j)
s[i][j]='#';//走過了的路不回頭
for(int e=0; e<4; e++)
dfs(i+dx[e], j+dy[e]);//繼續深搜
}int main()
return 0;
}
最基礎的深度優化搜尋 dfs 題目
前幾天回看自己大一剛開學刷oj時遇到的一道迴圈類題目,結合這個假期自已學的一點點演算法知識,重新寫了段 也算是加深自己對dfs的理解了。題目描述 將1,2,9共9個數分成3組,分別組成3個三位數,且使這3個三位數構成1 2 3的比例,試求出所有滿足條件的3個三位數。從演算法層面上說 這是一道最基礎的...
深度優先搜尋DFS
作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...
深度優先搜尋 DFS
深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...