#NOIP2012J1Q33. [NOIP 2012 普及组初赛] 第 33 题

[NOIP 2012 普及组初赛] 第 33 题

(排列数) 输入两个正整数n,m(1 < n < 20,1 < m < n),在1~n中任取m个数,按字典序从小到大输出所有这样的排列。

例如:

输入:3 2

#include <iostream>
#include <cstring>
using namespace std;
const int SIZE =25;
bool used[SIZE];
int data[SIZE];
int n,m,i,j,k;
bool flag;
int main(){
    cin>>n>>m;
    memset(used,false,sizeof(used));
    for(i=1;i<=m;i++){
        data[i]=i;
        used[i]=true;
    }
    flag=true;
    while(flag){
        for(i=1;i<=m-1;i++) cout << data[i] << " ";
        cout << data[m] << endl;
        flag= 【第1空】 ;
        for(i=m;i>=1;i--){
            【第2空】 ;
            for(j=data[i]+1;j<=n;j++)
                if(!used[j]){
                    used[j]=true;
                    data[i]=【第3空】 ;
                    flag=true;
                    break;
                }
            if(flag){
                for(k=i+1;k<=m;k++)
                    for(j=1;j<=【第4空】 ;j++)
                        if(!used[j]){
                            data[k]=j;
                            used[j]=true;
                            break;
                        }
                【第5空】 ;
            }
        }
    }
    return 0;
}

请填写【第2空】。

{{ input(1) }}