输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字C++。
时间: 2025-01-09 12:00:05 浏览: 22
### 使用 C++ 实现 1 到 n 的全排列
为了实现从 1 到 n 的所有不重复排列,可以采用深度优先搜索 (DFS) 方法来遍历所有可能的组合。以下是具体实现方法:
#### DFS 实现方式一
此版本通过 `dfs` 函数递归调用来构建每一个排列。
```cpp
#include<bits/stdc++.h>
using namespace std;
int ans[100]; // 存储当前路径上的节点值
bool vis[100]; // 访问标志位数组
int n; // 排列长度
void dfs(int step) {
if (step == n + 1) { // 当前步数等于目标长度加一时输出结果并返回上一层
for (int i = 1; i <= n; ++i)
cout << ans[i] << " ";
cout << endl;
return;
}
for (int i = 1; i <= n; ++i) { // 尝试放置第 i 个数字
if (!vis[i]) { // 如果该位置还未访问,则继续向下探索
ans[step] = i;
vis[i] = true;
dfs(step + 1);
vis[i] = false; // 回溯操作,撤销选择以便尝试其他可能性
}
}
}
int main() {
cin >> n;
dfs(1);
return 0;
}
```
这段代码展示了如何利用深度优先算法生成给定范围内的全部不同顺序列表[^1]。
#### DFS 实现方式二
另一种稍微不同的做法是在递归过程中加入额外条件判断以防止相邻两个元素相同的情况发生。
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, vis[101], a[101];
void P(int m){
if(m == n+1){
for(int i=1;i<=n;++i){
cout<<a[i]<<' ';
}
cout<<endl;
}
for(int i=1;i<=n;++i){
if(!vis[i] && (m==1 || i != a[m-1])){ // 额外增加了一个限制条件:不允许连续相同的数值
a[m]=i;
vis[i]=true;
P(m+1);
vis[i]=false;
}
}
}
int main(){
cin>>n;
P(1);
return 0;
}
```
这种方式同样能够有效地枚举出所有的合法解集,并且避免了某些特定模式下的冗余计算[^2]。
两种方案都基于回溯法的思想,在每一步决策时都会考虑尚未使用的候选者集合中的成员作为下一步的选择对象;一旦完成了一条完整的路径就会立即打印出来,之后再逐步撤消之前所做的决定回到更早的状态重新开始新的分支探索过程。
阅读全文