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

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;
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本欧洲标准(EN45545-1:2013)已由CEN/TC 256“铁路应用”的技术委员会制定,其秘书处由德国工业标准(DIN)组织。 本欧洲标准应赋予国家标准的地位,应于2013年9月前将本欧洲标准通过同文或者背书的形式列举出国家标准的条件,而对与之相矛盾的国家标准应予以撤销,最晚撤销日期不得迟于2016年3月。 需要引起注意的是,本文件中的某些内容有可能涉及一些专利权问题。欧洲标准委员会[和/或欧洲电工标准委员会]不负责识别任意或所有此类专利权。 本文件取代CEN/TS 45545-1:2009标准。 本欧洲标准根据欧洲委员会和欧洲自由贸易协会提交给欧洲标准化委员会的委托书而制定的,支持欧洲指令2008/57/EC的基本要求。 欧洲指令2008/57/EC的相关文件参见资料性附录ZA,该附录作为本欧洲标准的主要组成部分。 本系列欧洲标准“铁路应用—铁路车辆防火”由如下部分组成: — 第1部分:总则; — 第2部分:材料和部件的防火性能要求; — 第3部分:防火隔板的耐火要求; — 第4部分:铁路车辆设计的防火安全要求; — 第5部分:电气设备的防火安全要求,包括无轨电车、有轨客车和磁悬浮列车的电气设备; — 第6部分:火情控制和管理系统; — 第7部分:可燃液体及易燃性气体装置的防火安全要求。 依据欧洲标准化委员会和欧洲电工标准化委员会国际章程的要求,下列国家的国家标准组织应承诺履行本欧洲标准:澳大利亚、比利时、保加利亚、克罗地亚、塞浦路斯、捷克共和国、丹麦、爱沙尼亚、芬兰、前南斯拉夫马其顿共和国、法国、德国、希腊、匈牙利、冰岛、爱尔兰、意大利、拉脱维亚、立陶宛、卢森堡、马耳他、荷兰、挪威、波兰、葡萄牙、罗马尼亚、斯洛伐克、斯洛文尼亚、西班牙、瑞典、瑞士、土耳其和英国。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值