1. 程式人生 > 實用技巧 >DFS深度優先搜尋(附例題)

DFS深度優先搜尋(附例題)

深度優先搜尋,簡稱DFS,算是應用最廣泛的搜尋演算法,屬於圖演算法的一種,dfs按照深度優先的方式搜尋,通俗說就是“一條路走到黑”,dfs是一種窮舉,實質是將所有的可行方案列舉出來,不斷去試探,知道找到問題的解,其過程是對每一個可能的分支路徑深入到不能再深入為止,且每個頂點只能訪問一次。

dfs一般藉助遞迴來實現

例題:走迷宮

#include <iostream>
#include <string.h>
using namespace std;
int m,n;
int sx,sy,ex,ey;//起點終點座標
int mp[20][20];//記錄地圖
int cnt=0;//結果個數 int ax[10]={0,0,-1,1};//x的四個走向 int ay[10]={1,-1,0,0};//y的四個走向 int vis[20][20];//記錄是否來過 int dfs(int x,int y){ if((x>=0)&&(y>=0)&&(x<n)&&(y<m)&&(mp[x][y]==0)){//座標合法性 if(x==ex&&y==ey){//如果是終點 cnt++; return 0; } vis[x][y]
=1;//將x,y設為已經來過 if(vis[x][y]==1){//判斷是否相鄰頂點可走 for(int i=0;i<4;i++){ int tx=x+ax[i]; int ty=y+ay[i]; if((tx>=0)&&(ty>=0)&&(tx<n)&&(ty<m)&&(mp[tx][ty]==0)&&vis[tx][ty]==0)//相鄰頂點可走條件 dfs(tx,ty);//遞迴dfs此點 } } vis[x][y]
=0; return 0; } } int main(){ memset(vis,0,sizeof(vis));//將遍歷陣列全部置0 cin>>n>>m;for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ char c; cin>>c; if(c=='.'){//邊輸入邊置mp的0或1,並設定起點座標和終點座標 mp[i][j]=0; }else if(c=='S'){ sx=i; sy=j; mp[i][j]=0; }else if(c=='T'){ ex=i; ey=j; mp[i][j]=0; }else mp[i][j]=1;//'#'為牆壁,走不通所以設為1 } } dfs(sx,sy);//從起點開始遍歷 cout<<cnt<<endl; return 0; }