DFS全排列算法

#include<iostream>
#include<algorithm>
using namespace std;
int a[10],flag[10],n;
void dfs(int step)
{
    if(step==n+1)
    {
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(flag[i]==0)
        {
            a[step] = i;
            flag[i] = 1;
            dfs(step+1);
            flag[i] = 0; //回溯
        }
    }
    return;
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}

 

### DFS算法生成全排列 #### 背景介绍 深度优先搜索(Depth First Search, DFS)是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历节点,尽可能深地探索每条分支[^1]。 对于全排列问题,可以通过DFS来枚举所有的可能组合。具体来说,可以利用递归来实现这一过程,在每一层递归中尝试将当前未使用的元素加入到已有的序列中,并继续向下一层递归直到完成整个排列。 #### 实现方法 以下是基于C++语言的一个标准实现方式: ```cpp #include <iostream> #include <vector> using namespace std; void dfs(vector<int>& path, vector<bool>& used, int n) { if (path.size() == n) { // 当前路径长度等于n时输出结果 for(auto num : path){ cout << num << " "; } cout << endl; return; } for(int i = 1; i <= n; ++i){ // 尝试每一个数作为下一个位置的选择 if(!used[i]){ // 如果该数尚未被使用过,则将其加入路径并标记为已使用 path.push_back(i); used[i] = true; dfs(path, used, n); // 继续处理下一位 // 回溯操作:移除最后一个加入的数并将对应标志位重置为false以便后续其他情况能再次选用此数 path.pop_back(); used[i] = false; } } } int main(){ int m; cin >> m; vector<int> path; // 存储当前构建中的排列 vector<bool> used(m+1); // 记录哪些数字已经被选入排列 dfs(path, used, m); return 0; } ``` 上述代码定义了一个`dfs`函数用来执行实际的深度优先搜索逻辑。通过维护两个辅助结构——记录当前部分解的向量 `path` 和表示各数值是否已被选取的状态数组 `used[]` ,实现了对所有可行排列方案的有效穷尽访问[^2]。 #### 关键点解析 - **终止条件**: 当已经选择了m个不同的整数形成完整的排列时停止进一步深入。 - **选择列表&约束条件**: 对于每个待定的位置考虑从剩余可用候选集中挑选合适的成员填充之;这里借助布尔型变量组`used[]`控制重复取舍行为的发生与否。 - **状态更新与撤销**: 进入更深一层之前修改现有状况反映新增加的信息;退出之后恢复原状允许别的可能性得以考察。 #### 总结 采用DFS策略解决全排列问题是经典而有效的手段之一。其核心在于合理设计递归框架以及妥善管理过程中涉及的各种数据结构以支持正确无误的操作流程展开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值