c++编写一个求全排列的函数,要求输入n和m两个参数,其中1<n<10,0<m≤n,从1~n 中随机选取m个数字进行全排列,按照字典序愉出,每种排列占一行
时间: 2024-02-25 17:58:01 浏览: 68
全排列(按字典序输出)的C++代码
4星 · 用户满意度95%
好的,这是一个比较典型的全排列问题,以下是代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void permutation(vector<int>& nums, int begin, int end)
{
if (begin == end) {
for (int i = 0; i < nums.size(); i++) {
cout << nums[i] << " ";
}
cout << endl;
} else {
for (int i = begin; i <= end; i++) {
swap(nums[begin], nums[i]);
permutation(nums, begin+1, end);
swap(nums[begin], nums[i]);
}
}
}
int main()
{
int n = 6;
int m = 4;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
nums[i] = i + 1;
}
random_shuffle(nums.begin(), nums.end());
permutation(nums, 0, m-1);
return 0;
}
```
这里使用了递归的方式来实现全排列。函数permutation接受三个参数:一个是vector<int>类型的容器,另外两个是开始和结束的索引。当begin等于end时,表示已经完成了一种排列,将其输出即可。否则,从begin到end的每一个位置都尝试一遍,使用swap函数交换当前位置和begin位置的元素,然后递归调用permutation函数,将begin+1作为新的开始索引。递归结束后,再使用swap函数交换恢复原来的顺序,以便后续的尝试。在main函数中,先随机打乱1~n的顺序,然后调用permutation函数,将0和m-1作为开始和结束索引,只输出前m个元素的全排列即可。
阅读全文