DFS(深度优先搜索算法)入门理解和搜索路径详解

痴心易碎 提交于 2020-03-01 12:57:14

基本概念

        深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。

搜索思想

        深搜的思想就是一搜到底,而且已经搜索过的路径标记下来,不会重复搜索,如果一条路径的搜索不动了,那就退回,换一条路径搜索,知道所有的情况都搜索完。

基本模板

void dfs(int step)
{
	判断边界
	尝试每一种可能 for(i=1;i<=n;i++)
	{
		继续下一步 dfs(step+1) 
	} 
	返回 
}

搜索过程

深搜的思想就是一搜到底,如果搜索不动了,就退回换一条路径继续搜索,下面来看一个例子的搜索路径

例子的起始位置的(0,0),在一个九宫格内进行搜索。

#include<iostream>
using namespace std;
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};	
int book[3][3]={0};
int next[4][2]={0,1,1,0,0,-1,-1,0};//搜索顺序右下左上
int sum=0; 
void dfs(int x,int y,int step,string s)
{
	if(step==9)
	{
		sum++;
		cout<<"第"<<sum<<"条搜索路径"<<s<<endl;;
		return ;
	}
	for(int i=0;i<4;i++)
	{
		int tx=x+next[i][0];
		int ty=y+next[i][1];
		if(tx<0||tx>=3||ty<0||ty>=3)
			continue;
		if(book[tx][ty]==1)
			continue;
		book[tx][ty]=1;
		dfs(tx,ty,step+1,s+"->"+char('0'+a[tx][ty]));
		book[tx][ty]=0;
	}
}
int main()
{
	book[0][0]=1;
	dfs(0,0,1,"1");
	cout<<"一共"<<sum<<"条搜索路径"<<endl;
	return 1;            
}

运行结果:

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!