这道题用来两种解法:
一种是书上讲到的,寻找下一个 数列的规律解决,另一种方法是用C++标准模板库函数next_permutation()函数,直接得到下一个排列。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <list>
#include <math.h>
#include <algorithm>
using namespace std;
int MyCompare(const void* a,const void* b)
{
return *((int *)a)-*((int *)b);
}
void permutation1()
{
int m , n , k, i, j;
int an[1026];
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&n,&k);
for( i = 1 ; i<= n ; i++ )
scanf("%d",&an[i]);
an[0] = 10000;;
for( i = 0 ; i < k ; i++ )//找下一个序列
{
for( j = n ; j>=1 && an[j-1]>an[j] ; j--);
if( j>=1 )
{
int nMinLarger = an[j];
int nMinIdx = j;
for( int kk = j ; kk<=n ; kk++ )
{
if(nMinLarger > an[kk] && an[kk]>an[j-1] )
{
nMinLarger = an[kk];
nMinIdx = kk;
}
}
an[nMinIdx] = an[j-1];
an[j-1] = nMinLarger;
qsort(an+j,n-j+1,sizeof(int),MyCompare);
}
else
{
for( j = 1 ; j <= n ; j++ )
an[j] = j;
}
}
for( j = 1; j<=n ; j++)
printf("%d ",an[j]);
printf("\n");
}
}
void permutation2()
{
int m, n, k, i;
int an[1026];
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&n,&k);
for( i = 0 ; i < n ; i++ )
scanf("%d",&an[i]);
for( i = 0 ; i < k ; i++ )
{
next_permutation( an , an+n );//STL标准中的函数
}
for( i = 0 ; i < n ; i++ )
printf("%d ",an[i]);
printf("\n");
}
}
int main()
{
permutation1();
permutation2();
return 1;
}