top1编程
← 返回题目
题解

【递归】n个数的全排列

2 条题解

  • 0
    @ 2026-7-29 20:23:16
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int a[10], b[10];  // a存储当前排列,b存储输入的数字
    bool used[10];    // 标记数组,记录某个数字是否已使用
    int n;
    
    // 打印当前排列
    void print() {
        for(int i = 1; i <= n; i++) {
            cout << a[i];
            if(i < n) cout << " ";
        }
        cout << endl;
    }
    
    // 递归函数:为下标为x的位置选择数字
    void fun(int x) {
        // 尝试所有输入的数字
        for(int i = 1; i <= n; i++) {
            // 如果数字b[i]还没有被使用
            if(!used[i]) {
                a[x] = b[i];    // 将位置x赋值为b[i]
                used[i] = true; // 标记这个数字已被使用
                
                if(x == n) {    // 如果已经填到最后一个位置
                    print();    // 输出这个完整的排列
                } else {        // 否则
                    fun(x + 1); // 递归填写下一个位置
                }
                
                used[i] = false; // 回溯:撤销标记,让这个数字可以用于其他位置
            }
        }
    }
    
    int main() {
        cin >> n;
        for(int i = 1; i <= n; i++) {
            cin >> b[i];
        }
        
        // 对输入的数字进行排序,保证输出按字典序从小到大
        sort(b + 1, b + n + 1);
        
        fun(1);  // 从第一个位置开始填数字
        return 0;
    }
    
    • 0
      @ 2026-7-29 0:16:46
      #include <iostream>
      #include <algorithm>
      using namespace std;
      
      int a[10], b[10];  // a存储当前排列,b存储输入的数字
      bool used[10];    // 标记数组,记录某个数字是否已使用
      int n;
      
      // 打印当前排列
      void print() {
          for(int i = 1; i <= n; i++) {
              cout << a[i];
              if(i < n) cout << " ";
          }
          cout << endl;
      }
      
      // 递归函数:为下标为x的位置选择数字
      void fun(int x) {
          // 尝试所有输入的数字
          for(int i = 1; i <= n; i++) {
              // 如果数字b[i]还没有被使用
              if(!used[i]) {
                  a[x] = b[i];    // 将位置x赋值为b[i]
                  used[i] = true; // 标记这个数字已被使用
                  
                  if(x == n) {    // 如果已经填到最后一个位置
                      print();    // 输出这个完整的排列
                  } else {        // 否则
                      fun(x + 1); // 递归填写下一个位置
                  }
                  
                  used[i] = false; // 回溯:撤销标记,让这个数字可以用于其他位置
              }
          }
      }
      
      int main() {
          cin >> n;
          for(int i = 1; i <= n; i++) {
              cin >> b[i];
          }
          
          // 对输入的数字进行排序,保证输出按字典序从小到大
          sort(b + 1, b + n + 1);
          
          fun(1);  // 从第一个位置开始填数字
          return 0;
      }
      
      • 1