深度优先搜索入门
数字的全排列
深度优先搜索就是先走到底走到无路可走然后再进行回溯的算法,用于全排列打表操作,数字的全排列操作就是每一个序列需要包含从1到n所有的数字,但是数字不能重复,不能和原来有过的序列相同
思路:开一个bool数组用于记录当前下标的数字是否被使用过,同时开一个path数组用记录已经生成了的序列,便于输出,dfs函数的u是记录当前已经走过的步数,当步数等于n时表明已经走到了尽头需要进行回溯,在回溯前需要将已经保存在path数组的序列进行输出,每个输出后要换行,所以加了一个put。然后在没有达到最后一步时,对st数组进行遍历,如果有没有使用的数字就将其加到当前的path[u]中,然后将其变成true再送给下一层进行递归,再递归结束后恢复现场,让其变成false,因为path[u]赋值会覆盖上一次的值,所以path数组不用管。
代码如下
#include <iostream>
using namespace std;
const int N = 10;
int path[N];
bool st[N];
int n;
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++) printf("%d ", path[i]);
puts("");
return;
}
for (int i = 1; i <= n; i ++)
{
if (!st[i])
{
path[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
本文来自博客园,作者:LYL233,转载请注明原文链接:https://www.cnblogs.com/amour233/p/16465496.html

浙公网安备 33010602011771号