/*
找出从自然数,,。。。,n中任取r个数的所有组合。
例如n=5,r=3的所有组合为:
(1) 1,2,3 (2) 1,2,4 (3) 1,2,5 (4)1,3,4 (5) 1,3,5
(6) 1,4,5 (7) 2,3,4 (8)2,3,5 (9) 2,4,5 (10) 3,4,5
输入
n=5,r=3
输出
1- 5中所有个数的组合
*/
#include <iostream>
#include <vector>
using namespace std;
void main()
{
int n = 0,r=0;
cin>>n>>r;
vector<int> myvec;
vector<int> v_re;
for (int i= 0;i<n;i++)
{
myvec.push_back(i+1);
}
vector<int>::iterator it_p = myvec.begin();
vector<int>::iterator it_q = myvec.begin();
vector<int>::iterator it_end = myvec.end();
vector<int>::iterator it_begin = myvec.begin();
while(it_q-it_p != r ||it_q != it_end
||v_re.front() != *it_p)
{
if (it_q == it_end)
{
it_q = it_p + 1;
v_re.pop_back();
it_p = it_begin+v_re.back()-1;
}
while(v_re.size() != r && it_q != it_end)
{
v_re.push_back(*it_q);
it_q++;
}
if (v_re.size() < r)
{
it_p = it_begin+v_re.front();
it_q = it_p;
while(!v_re.empty())
v_re.pop_back();
if (myvec.back()-(*it_p) < (r-1))
{
break;
}
continue;
}
for (int j= 0;j<r;j++)
{
cout<<v_re[j]<<" ";
}
cout<<endl;
v_re.pop_back();
it_p = it_begin+v_re.back()-1;
}
}