You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.3 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
const int N = 30; //n的上限是20开数组是20+10=30个
vector<vector<int>> res;
//总结:要求双重排序的,都可以利用本题的思想干掉!
/**
*/
bool cmp(const vector<int> &a, const vector<int> &b) {
for (int i = 0; i < a.size(); i++)
if (a[i] != b[i]) return a[i] < b[i];
return false;
}
int main() {
int n, r;
cin >> n >> r; //n个自然数选择r个组成组合
for (int S = 0; S <= (1 << n) - 1; S++) {
//只要对应二进制数字的1的个数是r的
if (__builtin_popcount(S) == r) {
vector<int> t;
//遍历数字S的每一个二进制位
for (int i = 0; i <= n - 1; i++)
if (S & (1 << i)) t.push_back(i + 1);//i+1为对应的数字
//加入结果数组
res.push_back(t);
}
}
//1、每个子数组内部进行一轮排序
for (int i = 0; i < res.size(); i++)
sort(res[i].begin(), res[i].end());
//2、二维数组进行一次排序
sort(res.begin(), res.end(), cmp);
//输出
for (int i = 0; i < res.size(); i++) {
for (int j = 0; j < res[0].size(); j++)
printf("%3d", res[i][j]);
printf("\n");
}
return 0;
}