- 问答
四年级2班的程子原在吗???
- @ 2026-10-24 17:03:22
听说你要练题对吧?? 去搜一下这个题: #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; }好了
- 1