#include <iostream>
#include <vector>
#include <cstdio>
#define UL unsigned long int
using namespace std;
// 后r个全是1的时候终止
bool hasDone(vector<int>& index, int r){
for(auto i=index.size()-r; i < index.size(); i++){
if(index[i] == 0) return false;
}
return true;
}
vector<int> combination_justk(int n, int r, int k){
vector<int> index((UL)n, 0);
// 设置初始index, 前k个设置为1, 即r个1, n-r个0
for(int i=0;i<r;i++){
index[i] = 1;
}
// 记录初始组合
while(!hasDone(index, r)){
k--;
for(int i=0;i<index.size()-1;i++){
// 找到10的时候,交换10变成01
if(index[i] == 1 && index[i+1] == 0){
index[i] = 0;
index[i+1] = 1;
// 将i左边的序列恢复成最小的状态,即前面是1后面是0
int left_one_num=0;
for(int j=0;j<i;j++){
if(index[j] == 1){
index[j] = 0;
index[left_one_num++] = 1;
}
}
if(k-1==0){
return index;
}
else{
break;
}
}
}
}
return {};
}
void netease_test(int n, int m, int k){
if(n<=0 || m<=0 || k<=0) return;
auto index = combination_justk(n+m, n, k);
for(auto i:index){
if(i==1){
cout << ‘a‘;
}
else{
cout << ‘z‘;
}
}
cout << endl;
}
int main(int argc, char* argv[])
{
netease_test(2, 2, 6);// zzaa
return 0;
}
原文地址:https://www.cnblogs.com/theodoric008/p/9461106.html
时间: 2024-11-02 23:33:53