IT评测·应用市场-qidao123.com技术社区

标题: 深入明白全排列算法:DFS与回溯的完美结合 [打印本页]

作者: 种地    时间: 2025-4-11 10:50
标题: 深入明白全排列算法:DFS与回溯的完美结合
全排列问题是算法中的经典问题,其目的是将一组数字的全部大概排列组合列举出来。本文将详细解析怎样通过深度优先搜索(DFS)回溯法高效生成全排列,并通过模拟递归过程资助读者彻底掌握其核心思想。

问题形貌

给定一个正整数 n,生成数字 1 到 n 的全部排列。例如,当 n = 3 时,输出应为:
  
  1. 1 2 3
  2. 1 3 2
  3. 2 1 3
  4. 2 3 1
  5. 3 1 2
  6. 3 2 1
复制代码
算法思路

1. 核心变量


2. DFS递归函数

  
  1. void dfs(int u) {
  2.     if (u == n) {  // 终止条件:排列已填满
  3.         print_permutation();  // 输出当前排列
  4.         return;
  5.     }
  6.     for (int i = 0; i < n; i++) {
  7.         if (!dt[i]) {  // 如果数字i未被使用
  8.             path[u] = i;  // 选择i
  9.             dt[i] = true;  // 标记为已使用
  10.             dfs(u + 1);   // 递归填充下一位
  11.             dt[i] = false; // 回溯:恢复状态
  12.         }
  13.     }
  14. }
复制代码

3. 主函数

  
  1. int main() {
  2.     scanf("%d", &n);
  3.     dfs(0);  // 从第0位开始生成排列
  4.     return 0;
  5. }
复制代码
递归过程模拟(以n=2为例)

初始状态



递归调用树

第一层调用:dfs(0)


第二层调用:dfs(1)


第三层调用:dfs(2)


回溯到 dfs(1)


回溯到 dfs(0)


第二层调用:dfs(1)


第三层调用:dfs(2)


回溯到 dfs(1)


回溯到 dfs(0)


最终输出

  
  1. 1 2
  2. 2 1
复制代码
关键步调总结


递归树图示

  
  1. dfs(0)
  2. ├─ i=0 (选1)
  3. │  ├─ dfs(1)
  4. │  │  ├─ i=1 (选2) → dfs(2) → 输出 [1, 2]
  5. │  │  └─ 回溯:释放2
  6. │  └─ 回溯:释放1
  7. └─ i=1 (选2)
  8.    ├─ dfs(1)
  9.    │  ├─ i=0 (选1) → dfs(2) → 输出 [2, 1]
  10.    │  └─ 回溯:释放1
  11.    └─ 回溯:释放2
复制代码
关键点总结


优化与扩展


完备代码(C语言)

[code][/code]         通过DFS和回溯的结合,我们可以高效地生成全排列。明白递归的睁开与回溯是掌握该算法的关键。盼望本文的逐步解析能资助你彻底掌握这一经典问题!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4