dfs搜索框架整理

在对dfs的搜索框架进行debug的时候,发现每次出现的错误总是很类似的,这里对其进行整理一下。

总体思想:

dfs的时候,已进入函数体,有2种情况:
1 一种是当前已经包含了当前搜索的点,这个时候不需要在函数内部进行标记,只要在遍历的时候进行标记即可。

2 另外一种情况是当前还没有访问当前搜索的点,那么这个时候就要先判断是否越界,然后访问当前的点,并且进行标记,然后再进行结果剪枝, 再进行搜索。

比如剑指offer 12
这里的第一种写法是

第1种写法

在dfs访问的时候不进行标记,那么dfs访问之前必须标记好
bool dfs(board,mark,word,curstep,currow,curcol){
	if(越界)return false;
	
	if(board[currow,curcol]!=word[step]){
		return false;//将要收入的点不符合,那么直接不通过
	}
	//此处相当于收入节点,并且进行判断
	if(curstep+1==word.size){
		return true;//已经搜索到了结尾
	}
	bool ans=false;
	for(对周围的点进行搜索){
		newrow,newcol;
		if(没有搜索过,并且没有越界){
			mark[newrow,newcol]=1;
			ans=dfs(curstep+1);
			mark[newrow,newcol]=0;
		}
	}
	return ans;
}

bool fun(){
	for(对每行){
		for(对每列){
			mark[row,col]=1;//在进入之前要进行标记
			dfs(row,col)=0;
			mark[row,col]=0;
		}
	}
	return ans;
}

第2种写法

在dfs访问的时候进行标记,那么dfs访问的结尾要擦去标记
bool dfs(board,mark,word,curstep,currow,curcol){
	if(越界)return false;
	
	if(board[currow,curcol]!=word[step]){
		return false;//将要收入的点不符合,那么直接不通过
	}
	//此处相当于收入节点,并且进行判断
	if(curstep+1==word.size){
		return true;//已经搜索到了结尾
	}
	//下面一行注意
	mark[currow,curcol]=1;//这里进行标记!!!!
	
	bool ans=false;
	for(对周围的点进行搜索){
		newrow,newcol;
		if(没有搜索过,并且没有越界){
			mark[newrow,newcol]=1;
			ans=dfs(curstep+1);
			mark[newrow,newcol]=0;
		}
	}
	mark[currow,curcol]=0;//这里要擦去标记!!!
	return ans;
}

bool fun(){
	for(对每行){
		for(对每列){
			//在进入之前不再需要进行标记
			dfs(row,col)=0;
		}
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS搜索是一种使用深度优先遍历算法实现的搜索方法,用于在树或图中查找特定节点或解决问题。在Python中,可以使用递归或栈数据结构来实现DFS搜索算法。DFS搜索算法的基本思想是从起始节点开始,沿着树的深度优先遍历节点,并尽可能深入搜索树的分支。当搜索到达一个节点时,它会沿着未探索过的边继续向下搜索,直到无法继续深入为止。然后,搜索会回溯到上一个未探索的节点,并开始搜索其他分支。这个过程会一直进行下去,直到所有节点都被访问为止。 在Python中实现DFS搜索算法,可以使用递归方法或者显式地使用栈数据结构来模拟递归过程。递归方法通过递归函数来实现深度优先遍历,每次递归调用都会遍历当前节点的子节点。而显式地使用栈数据结构,则会将每个节点及其相关信息压入栈中,以便在回溯时能够继续搜索其他分支。 例如,可以使用以下Python代码实现DFS搜索算法: ```python def dfs(graph, start): visited = set() # 用于存储已访问过的节点 stack = [start # 使用栈来模拟递归过程 while stack: node = stack.pop() # 弹出栈顶节点 if node not in visited: visited.add(node) # 将节点标记为已访问 neighbors = graph[node # 获取当前节点的邻居节点 for neighbor in neighbors: stack.append(neighbor) # 将邻居节点压入栈中 return visited ``` 这段代码实现了一个简单的DFS搜索算法。其中,graph表示图的邻接关系,start表示起始节点。算法使用一个集合visited来记录已访问过的节点,使用一个栈stack来模拟递归过程。在每次循环中,算法从栈中弹出一个节点,检查它是否已访问过。如果没有访问过,则将其标记为已访问,并将其邻居节点压入栈中。算法重复这个过程,直到栈为空。 可以根据具体的应用场景和需求,对DFS搜索算法进行相应的改进和扩展。比如,可以添加目标节点的判断条件,以找到特定的节点或解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值