1 条题解

  • 0
    @ 2025-4-8 20:13:45

    解题思路

    这道题要求我们从一个给定的升序排列的集合 ( S ) 中,选出所有可能的 6 个数字的组合,并按字典序输出。由于 ( k ) 的范围较小(( 6 < k < 13 )),我们可以使用 回溯(Backtracking)DFS(深度优先搜索) 来生成所有组合。

    关键步骤

    1. 输入处理

      • 读取 ( k ) 和集合 ( S )(已经升序排列)。
      • 当 ( k = 0 ) 时终止输入。
    2. 生成组合

      • 使用 回溯法 递归生成所有长度为 6 的组合,确保每个组合内部保持升序。
      • 由于输入已经是升序的,递归时只需按顺序选取数字,自然保证组合的字典序。
    3. 输出控制

      • 每个组合的数字用空格分隔,按升序排列。
      • 不同测试用例之间用空行分隔,最后一个测试用例后不加空行。

    C++ 代码实现

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void backtrack(const vector<int>& nums, vector<int>& current, int start, int k) {
        if (current.size() == 6) {
            for (int i = 0; i < 6; ++i) {
                if (i > 0) cout << " ";
                cout << current[i];
            }
            cout << endl;
            return;
        }
        for (int i = start; i < k; ++i) {
            current.push_back(nums[i]);
            backtrack(nums, current, i + 1, k);
            current.pop_back();
        }
    }
    
    int main() {
        int k;
        bool first_case = true;
        while (cin >> k && k != 0) {
            if (!first_case) {
                cout << endl; // 测试用例之间空一行
            }
            first_case = false;
            
            vector<int> nums(k);
            for (int i = 0; i < k; ++i) {
                cin >> nums[i];
            }
            
            vector<int> current;
            backtrack(nums, current, 0, k);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1246
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者