Ignatius and the Princess II
"Now I will show you the first problem." feng5166 says, "Given a sequence of number 1 to N, we define that 1,2,3...N-1,N is the smallest sequence among all the sequence which can be composed with number 1 to N(each number can be and should be use only once in this problem). So it's easy to see the second smallest sequence is 1,2,3...N,N-1. Now I will give you two numbers, N and M. You should tell me the Mth smallest sequence which is composed with number 1 to N. It's easy, isn't is? Hahahahaha......"
Can you help Ignatius to solve this problem?
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,num,a[1010],f[1010];
void print_permulation(int cur){
if(num==m)
return;
if(cur==n){
++num;
if(m==num){
for(int i=0;i<n-1;i++)
cout<<a[i]<<' ';
cout<<a[n-1]<<'\n';
}
return;
}
for(int i=1;i<=n;i++){
if(!f[i]){
a[cur]=i;
f[i]=1;
print_permulation(cur+1);
f[i]=0;
}
}
}
int main(int argc, char **argv){
// freopen("a.txt","r",stdin);
while(cin>>n>>m){
num=0;
memset(f,0,sizeof(f));
print_permulation(0);
}
return 0;
}
STL中的next_permulation(),速度更快,還精簡:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m,p[1010];
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
p[i]=i+1;
int k=0;
do
{
k++;
if(k==m)
{
for(int i=0;i<n-1;i++)
cout<<p[i]<<' ';
cout<<p[n-1]<<'\n';
break;
}
}while(next_permutation(p,p+n));
}
return 0;
}