#140. NOIP2012PJ-28

NOIP2012PJ-28

28.(完善程序)

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

输入:

3 2

输出:

1 2

1 3

2 1

2 3

3 1

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=    ①     ;
		for(i=m;i>=1;i--)
		{
			     ②     ;
			for(j=data[i]+1;j<=n;j++)
				if(!used[j])
				{
					used[j]=true;
					data[i]=    ③   ;
					flag=true;
					break;	
				}
			if(flag)
			{
				for(k=i+1;k<=m;k++)
					for(j=1;j<=    ④   ;j++)
					if(!used[j])
					{
						data[k]=j;
						used[j]=true;
						break;
					}
				     ⑤   ;
			}
		}
	}
	return 0;	
}

①:{{ input(1) }}

②:{{ input(2) }}

③:{{ input(3) }}

④:{{ input(4) }}

⑤:{{ input(5) }}