代码功能概述
这段 C++ 代码实现了一个经典的深度优先搜索(DFS)算法,用于生成从 1 到 n
的所有全排列。具体来说,它通过递归的方式遍历所有可能的数字排列,并将每一种排列输出。
代码详细解释
1. 头文件和命名空间
收起
cpp
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#include<iostream>
:用于输入输出流操作,如cin
和cout
。#include<cstdio>
:用于标准输入输出,这里主要使用printf
和puts
进行输出。#include<cstring>
:用于字符串处理,虽然在本代码中未直接使用,但可能在其他相关场景中会用到。#include<algorithm>
:包含了一些常用的算法,在本代码中未直接使用。using namespace std;
:使用标准命名空间,这样可以直接使用标准库中的函数和对象,而无需加std::
前缀。
2. 常量和全局变量
收起
cpp
const int N = 10;
int st[N];
int n;
bool used[N];
const int N = 10;
:定义一个常量N
,表示数组的最大长度。int st[N];
:用于存储当前的排列,st[i]
表示排列中的第i
个位置的数字。int n;
:表示要生成全排列的数字范围是从 1 到n
。bool used[N];
:用于标记数字是否已经在当前排列中使用过,used[i]
为true
表示数字i
已经被使用,为false
表示未被使用。
3. 深度优先搜索函数 dfs
收起
cpp
void dfs(int u)
{
if (u > n)
{
for (int i = 1; i <= n; i++) printf("%d ", st[i]);
puts("");
return;
}
for (int i = 1; i <= n; i++)
{
if (!used[i])
{
st[u] = i;
used[i] = true;
dfs(u + 1);
st[u] = 0;
used[i] = false;
}
}
}
- 递归终止条件:
if (u > n)
:当u
大于n
时,表示已经生成了一个完整的排列,此时将st
数组中的元素输出,并换行。
- 递归过程:
for (int i = 1; i <= n; i++)
:遍历从 1 到n
的所有数字。if (!used[i])
:如果数字i
还未被使用,则将其放入st[u]
位置,并标记为已使用。dfs(u + 1)
:递归调用dfs
函数,继续生成下一个位置的数字。st[u] = 0; used[i] = false;
:回溯操作,将st[u]
位置重置为 0,并将数字i
标记为未使用,以便尝试其他可能的排列。
4. 主函数 main
收起
cpp
int main()
{
cin >> n;
dfs(1);
return 0;
}
cin >> n;
:从标准输入读取一个整数n
,表示要生成全排列的数字范围。dfs(1);
:调用dfs
函数,从第一个位置开始生成全排列。return 0;
:程序正常结束。
复杂度分析
- 时间复杂度:生成
n
个数字的全排列的时间复杂度为 ,因为总共有 种不同的排列。 - 空间复杂度:主要使用了
st
数组和used
数组,空间复杂度为 。
示例运行
假设输入 n = 3
,程序将输出:
收起
plaintext
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
这些是 1 到 3 的所有全排列。