听说你要练题对吧?? 去搜一下这个题: #3000. 选排列的生成 ID: 3000 传统题 1000ms 256MiB 尝试: 137 已通过: 45 普及/提高-

上传者:Sam (ming) 标签> 题目描述: 设有𝑛个整数的集合 {1,2,3,…,𝑛}从中取出任意𝑟个数进行排(0<𝑟<𝑛<20),请编程输出所有的排列方案。要求按照字典序输出所有可能的排列。

输入格式: 一行,包含两个整数𝑛和𝑟,以空格分隔。

输出格式 输出若干行,每行表示一个排列方案,其中𝑟个数字用空格分隔。 最后一行输出 total= 后跟一个整数,表示排列的总方案数。所有排列必须严格按照字典序升序输出。

样例输入: 4 2 Copy 样例输出: 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3 total=12 Copy 数据范围与提示:0<𝑟<𝑛<20 字典序规则:比较两个排列时,从左到右逐位比较,数值小的排列在前。 本题要求的是排列(Permutation),即顺序不同视为不同方案。

会的话发在评论区,我等你的回话,加油!!!

4 条评论

  • #include <iostream>
    #include <vector>
    using namespace std;
    
    int n, r;
    vector<int> path;
    vector<bool> used;
    vector<vector<int>> res;
    
    void backtrack() {
        if (path.size() == r) {
            res.push_back(path);
            return;
        }
        for (int i = 1; i <= n; ++i) {
            if (!used[i]) {
                used[i] = true;
                path.push_back(i);
                backtrack();
                path.pop_back();
                used[i] = false;
            }
        }
    }
    
    int main() {
        cin >> n >> r;
        used.resize(n + 1, false);
        backtrack();
        // 输出所有排列
        for (auto &v : res) {
            for (int i = 0; i < v.size(); ++i) {
                if (i > 0) cout << " ";
                cout << v[i];
            }
            cout << endl;
        }
        cout << "total=" << res.size() << endl;
        return 0;
    }
    
    
    
    

    好了

    • 他是我同学

      • @ 2026-10-24 17:03:57

        快亿点

        • 1