之所以总结一下dfs,是因为刷python题目时候遇到一个题,单词搜索问题,类似于dfs思想的题目,不太会做,然后就总结一下。
准备PAT!!!
什么是DFS
Depth First Search英文的缩写,翻译过来就是“深度优先搜索”。
深度优先遍历的主要思想就是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问。
沿着某条路径遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。
即:不撞南墙不回头
数据结构
visit[]//判断是否访问
算法过程
- 任意选择一个起点v,访问该顶点
- 沿深度方向,依次遍历未访问邻节点
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
未完待续…