1 条题解
-
0
#include <bits/stdc++.h> using namespace std; // [1] n-输入的整数个数(1≤n≤8) int n; // [2] crr数组-存储输入的n个不相等的整数(排序后用于生成字典序排列) int crr[100]; // [3] arr数组-存储当前正在生成的排列(临时缓冲区) int arr[100]; // [4] brr数组-标记数组,brr[i]=1表示crr[i]已被选入当前排列,0表示未被使用 int brr[100]={}; // [5] dfs递归函数:生成全排列 // 参数len - 当前已生成的排列长度(从0到n-1) void dfs(int len){ // 递归终止条件:当前排列长度等于n,说明生成了一个完整的排列 if(len==n){ // 输出当前生成的排列,每个数字后加空格 for(int i=0;i<len;i++) cout<<arr[i]<<" "; cout<<endl; return; } // 遍历所有输入的整数,尝试将未使用的整数加入当前排列 for(int i=0;i<n;i++){ if(brr[i]==0){ // [6] 判断当前整数crr[i]是否未被使用 arr[len]=crr[i]; // [7] 将crr[i]加入当前排列的第len位 brr[i]=1; // [8] 标记crr[i]为已使用,避免重复选择 dfs(len+1); // [9] 递归生成下一位(len+1)的排列 brr[i]=0; // [10] 回溯:将crr[i]标记为未使用,尝试其他选择 } } } int main() { cin>>n; // [11] 读取输入的整数个数n for(int i=0;i<n;i++) cin>>crr[i]; // [12] 读取n个不相等的整数,存入crr数组 sort(crr,crr+n); // [13] 对crr数组排序,保证生成的排列按字典序递增输出 dfs(0); // [14] 开始递归生成排列:初始排列长度为0 return 0; }
- 1
信息
- ID
- 1271
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者