dfs-P1706全排列

题目描述

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n。

输出格式

由 1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 个场宽。

### 输入 #1

```
3
```

### 输出 #1

```
    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1
```

## 说明/提示

1≤n≤9


方法一:使用dfs

#include<stdio.h>
#include<iostream>
#include<malloc.h>  // 可能未使用,可考虑移除
#define ERROR 0     // 宏定义未实际使用
#define OK 1
#define ElemType int
using namespace std;

int n;              // 用户输入的排列元素个数
int v[20]={0};      // 访问标记数组,v[i]=1表示数字i已被使用
int ans[20];        // 存储当前生成的排列结果

// 输出当前排列结果
void output() {
    for(int i=1; i<=n; i++) {  // 注意数组从下标1开始存储
        cout<<"    "<<ans[i];   // 每个数字前输出四个空格
    }
    cout<<endl;
}

// 深度优先搜索生成全排列
// 参数k表示当前正在填充第k个位置(从0开始计数)
void dfs(int k) {
    if(k == n) {    // 递归终止条件:已生成完整的排列
        output();
        return;
    }
    // 遍历所有可能的数字
    for(int i=1; i<=n; i++) {
        if(v[i] != 1) {         // 如果数字i未被使用
            v[i] = 1;           // 标记为已使用
            ans[k+1] = i;       // 将i存入排列的第k+1位置(下标从1开始)
            dfs(k+1);           // 递归填充下一个位置
            v[i] = 0;           // 回溯,恢复未使用状态
        }
    }
}

int main() {
    cin >> n;       // 输入排列长度
    // 注意:当n>=20时会导致数组越界,存在安全隐患
    dfs(0);         // 从第0层开始生成排列
    return 0;
}

方法二:使用 C++ STL 的 next_permutation 函数: 

#include <iostream>
#include <algorithm>  // 包含 next_permutation
using namespace std;

int main() {
    int n;
    cin >> n;
    int a[20];  // 存储排列的数组
    for (int i = 0; i < n; i++) {
        a[i] = i + 1;  // 初始化数组为 1, 2, ..., n
    }

    do {
        for (int i = 0; i < n; i++) {
            cout << "    " << a[i];  // 输出当前排列
        }
        cout << endl;
    } while (next_permutation(a, a + n));  // 生成下一个排列

    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值