深度优先搜索,简称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; }