

文章目录
正文
1. dfs 回溯
1.1 回溯介绍
-
核心思想:通过试错的方式探索所有可能得解,当发现当前路径无法得到有效解时,撤销(回溯)最近一步的选择,尝试其他分支。
-
关键步骤
- 选择:在当前步骤做出一个选择。
- 递归:基于这个选择进入下一层决策。
- 撤销(回溯):如果当前路径不满足条件,回退到上一步,尝试其他选择。
【注】实际上,回溯算法比较灵活,需要具体情况具体分析。
1.2 回溯模板
【求 1 ~ n 的全排列 】
#include <iostream>
#define IOS ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const int N = 1e5 + 10;
int n, a[N]; bool vis[N];
// 回溯
void dfs(int deep)
{
if (deep == n + 1)
{
for (int i = 1; i <= n; i ++) cout << a[i] << " \n"[i == n];
return ;
}
for (int i = 1; i <= n; i ++)
{
if (vis[i]) continue;
vis[i] = true; a[deep] = i;
dfs(deep + 1); vis[i] = false;
}
}
void solve()
{
cin >> n; dfs(1);
}
int main()
{
IOS; int _ = 1; // cin >> _;
while (_ --) solve();
return 0;
}
1.3 回溯经典题目
【题目】

最低0.47元/天 解锁文章
5021

被折叠的 条评论
为什么被折叠?



