深度优先搜索的简单应用——全排列列举

1.深度优先搜索

深度优先搜索(DFS,Deep First Search)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

深度优先搜索属于盲目搜索,它并不考虑目标在哪里,只是按照一种既定的策略进行搜索,直到找到目标或者遍历完整个图。DFS常用的策略是先沿着一条路径搜索到底,然后再回溯到上一个节点,继续搜索下一条路径,直到所有的路径都搜索完。

在图的遍历中,深度优先搜索的策略可以简单地描述为:访问一个顶点,然后递归地访问与此顶点相邻的未被访问过的所有顶点。在树中,由于不存在环路,所以这种搜索策略是有效的。但是,在图中,由于存在环路,所以必须注意避免重复访问已经访问过的顶点。为此,通常使用一个布尔数组或者哈希表来标记已经访问过的顶点。

深度优先搜索在图论和计算机科学中有着广泛的应用,例如解决图的连通性问题、寻找图中的路径、生成图的拓扑排序等。此外,深度优先搜索也是很多其他复杂算法的基础,如回溯法、动态规划等。

2.深度优先搜索(DFS)在列举全排列时,可以采用递归的方式进行。

  1. 确定递归函数:定义一个递归函数,比如dfs(arr, visited, output, index),其中arr是待排列的数组,visited是一个布尔数组用于标记元素是否被访问过,output是当前已经排列好的部分结果,index是当前要填充的位置。
  2. 递归终止条件:当index等于排列的长度时,说明已经找到了一个完整的排列,可以将output输出或保存起来。
  3. 遍历所有可能:在每一步中,遍历数组arr,对于每一个未被访问过的元素,将其标记为已访问,并将其添加到output的当前位置,然后递归调用dfs函数填充下一个位置。
  4. 回溯:在递归返回后,需要将当前位置的元素从output中移除,并将其标记为未访问,以便在后续的遍历中可以再次选择该元素。

3.深度优先搜索(DFS)列举全排列

#include<iostream>
#include<string.h>
#define MAX 10
using namespace std;
int a[MAX+1],book[MAX+1],n;

void dfs(int step){

    if (step==n+1)
    {
        for (int i = 1; i <=n; i++)cout<<a[i]<<" ";
        putchar(10);
        return;
    }

    for (int i = 1; i <=n; i++)//每个盒子尝试顺序
    {
        if (book[i]==0)
        {
            a[step]=i;//放入盒子的数字
            book[i]=1;//标记该数字已使用
            dfs(step+1);//下一个盒子
            book[i]=0;//标记该数字已取回
        }
        
    }
    return;
    
}

int main(){
    cin>>n;
    dfs(1);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值