DFS (深度优先搜索)

DFS (深度优先搜索)

(与BFS比较)DFS更适合树结构,BFS更适合图结构

适合情况:

  1. 具有递归性质的问题
  2. 适合地图类型的问题
  3. 需要情况列举的问题

判断思路:

  1. 是否能转换成树形结构和图结构
  2. 思考转换后状态的数据量
  3. 如果数据量较多,思考是否有可能进行剪枝处理( ?)
  4. 判断是否能用DFS

数据型:
全排列 (其中包含深度优先搜索的基本模型)

#include <iostream>
using namespace std;
const int MAXN = 1007;
int a[MAXN],book[MAXN]={},n;//一共有n个盒子
void dfs(int step)//step表示现在站在第几个盒子面前
{	
	if(step==n+1)///如果站在第n+1个盒子面前(没有第		  n+1的盒子),则表示前n个盒子已经放好扑克牌
    	{
        	///输出一种排列
        	for(int i=1;i<=n;i++)
            		cout << a[i];
        	cout << endl;
        	return;///返回之前一步(最近一次调用dfs函数的地方)
   	 }
    	for(int i=1;i<=n;i++)
    	{
        	///判断扑克牌i是否还在手上
        	if(book[i]==0)
        	{
            		a[step]=i;///将i号扑克牌放入第step个盒子
            	book[i]=1;
            	dfs(step+1);
            	book[i]=0;///一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
        	}
    	}
    return;
}
int main()
{
    cin >> n;
    dfs(1);///首先站在1号小盒子面前
    return 0;
}

地图型:
地图问题(在某一地图中寻找从起始点到终点的最短路径)
有一个m n格的迷宫(表示有m行,n列),其中包含障碍物,1表示有障碍物,0表示无障碍物可以前进。

#include <iostream>
using namespace std;
const int maxn = 1007;
int x, y, step, p, q, sx, sy, tx, ty, n, m, Min = 99999999;
int a[maxn][maxn];
int book[maxn][maxn]={};//该数组判断某一点是否走过 
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//分别为向右走,向下走,向左走和向上走 
void dfs(int x, int y, int step)//此时走到的点的x坐标,y坐标以及当前已经走过的步数step 
{
	if(x==p && y==q)
	{
		//更新最小值 
		if(step<Min)
		{
			Min=step;
		}
		return;
	}
	for(int k=0; k<4; k++)
	{
		tx=x+next[k][0];
		ty=y+next[k][1];
		//判断是否越界 
		if(tx<1||tx>n||ty<1||ty>m)
			continue;
		//判断该点是否为障碍物或已经走过 
		if(a[tx][ty]==0 && book[tx][ty]==0)
		{
			book[tx][ty]=1;//标记该点已经走过 
			dfs(tx,ty,step+1);//开始尝试下一个点 
			book[tx][ty]=0;//尝试结束,取消这个点的标记 
		 } 
	 } 
	return;
}
int main()
{
	cin >> n >> m;
	//读入迷宫
	for(int i=1; i<=n; i++)
		for(int j =1; j<=m; j++)
			cin >> a[i][j]; 
	cin >> sx >> sy >> p >> q; //读入起始点坐标和终点坐标 
	book[sx][sy]=1;
	dfs(sx,sy,0);
	cout << Min << endl;
	return 0; 
}

 - List item

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
深度优先搜索DFS)是一种图遍历算法,适用于解决图的连通性、遍历和寻找路径等问题。在应用DFS算法时,常常需要将图的结构表示为数组。 建立一个DFS深度优先搜索数组时,可以按照以下步骤进行操作: 1. 首先,创建一个与图中顶点数量相等的数组,用于记录每个顶点的访问状态。初始时,将所有的数组元素初始化为未访问状态。 2. 然后,选择一个起始顶点,将其标记为已访问,并将该顶点入栈。 3. 从起始顶点开始,循环执行以下步骤:弹出栈顶元素(当前顶点),并输出该顶点的值; 4. 遍历该顶点的所有邻接顶点,若某个邻接顶点未被访问,则将其标记为已访问,并将其入栈。 5. 若当前顶点没有未被访问的邻接顶点,则继续弹出栈顶元素,即回溯到上一个顶点,直到栈为空。 6. 当图中所有顶点都被访问过后,DFS深度优先搜索结束。 通过上述步骤,我们可以将图的结构以数组的形式表示,并使用DFS算法进行遍历。在数组中,每个元素代表一个顶点,其对应的值表示该顶点是否已经被访问。通过设置一个栈来保存待访问的顶点,不断地出栈和入栈的操作,实现了DFS算法的深度遍历特性。 需要注意的是,数组的索引可以用来唯一标识顶点,索引值对应的元素则表示该顶点的访问状态。此外,可以根据具体需求,对数组进行扩展,以记录其他需要的信息,比如顶点的父节点、访问时间等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值