1 条题解

  • 0
    @ 2026-1-27 22:17:20
    #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
    上传者