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;
}

 

posted @ 2020-08-05 18:43  nilbook  阅读(733)  评论(0)    收藏  举报