例如1 2 3的全排列
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
从最后一个数开始与前面那个数相比较,如果后面那个数大于前面那个数,两数交换位置的所有组合
next-permutation一次就是交换一次位置。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int m,n;
while(~scanf("%d%d",&m,&n))
{
int a[1010];
for(int i=0;i<m;i++)
a[i]=i+1;
int sum=0;
do{//核心部分 寻找交换第n次的全排列
sum++;
if(sum==n)
{
for(int j=0;j<m;j++)
{
cout<<a[j];
if(j!=m-1)
cout<<" ";
}
}
if(sum==n)
break;
}while(next_permutation(a,a+m));
cout<<endl;
}
return 0;
}
这道题当时还有一个出错点 就是无限输入那个地方
如果使用scanf 要写成while(~scanf())
如果是cin就不用~