深度优先dfs


之所以总结一下dfs,是因为刷python题目时候遇到一个题,单词搜索问题,类似于dfs思想的题目,不太会做,然后就总结一下。


准备PAT!!!

什么是DFS

Depth First Search英文的缩写,翻译过来就是“深度优先搜索”。

深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。

沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。

即:不撞南墙不回头

数据结构

visit[]//判断是否访问

算法过程

  1. 任意选择一个起点v,访问该顶点
  2. 沿深度方向,依次遍历未访问邻节点

tips:每次访问后都要将访问的vist[]变成1

递归伪代码
DFS(dep,、、、)        //dep代表目前DFS的深度
{
    if(找到解 || 走不下去){
        、、、     //在此处进行相应的操作
        return ;
    }
    枚举下一种情况,DFS(dep+1,、、、)
}
非递归伪代码
bool visited[MAXNODE];      //顶点的访问标识数组
void DFSInit(Graph G){
    for(i=0; i<G.VertexNum; i++){
        visited[i] = false;
    }
}

void DFS(Graph G,int v){  //v:顶点数组中的序号
    Visit[v];  visited[v]=true;
    w = FirstAdj(G,v);    //返回:v的第一个邻接点,0表示无邻接点
    while(w!=0){   
        if(!visited[w]{
            DFS(G,w);   //参数传递w->v
        }
        w = NextAdj(G,v,w);   //返回:v的在邻接点w后的邻接点,0表示不存在
    }
}   
  • 其中一种DFS序列:DFS(G,v1) = (v1,v2,v3,v6,v5,v7,v4,v8,v9)
小结

dfs即找准了一条路,如果满足判定成功条件或者失败条件(撞南墙)就返回上一个节点,再从这个节点继续找下一个,再撞再回溯。

单词搜索问题
def dfs(self,i,j,cmap,word):
        if len(word)==0:
            #撞南墙
            return True
        #撞南墙
        elif i>=len(cmap) or i<0 or j<0 or j>=len(cmap[0]) or word[0]!=cmap[i][j]:
            return False
        temp=cmap[i][j]
        cmap[i][j]='#'
        res =self.dfs(i+1,j,cmap,word[1:]) or self.dfs(i-1, j, cmap, word[1:]) or self.dfs(i, j+1, cmap, word[1:]) or self.dfs(i, j-1, cmap, word[1:])
        #四种方向,其中有一种return True那这个节点即return True
        cmap[i][j]=temp
        return res


未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值