题目:pku1833 代码: /* *http://wenku.baidu.com/view/233add3143323968011c92c9.html *字典序法 *1:求 i=max{j| pj-1<pj }(找最后一个正序) *2:j=max{k| pi-1<pk}(找最后大于pi-1者) *3:互换pi-1与pj *4:反排pj后面的数得到(q) *5:重复步骤1 */ #include<iostream> #include<algorithm> #include<vector> using namespace std; int total = 0; //找最后一个正序 int FindTheLastActiveSeq(int array[],int length) { for(int i = length - 1; i >= 1;i--) { if(array[i] > array[i-1]) return i-1; } return -1; } //最后大于array[index]者 int FindTheLastBigger(int array[],int length,int index) { for(int i = length - 1;i > index; i--) { if(array[i] > array[index]) return i; } return -1; } //换pi-1与pj void swap(int& num1 ,int &num2) { int temp = num1; num1 = num2; num2 = temp; } //反排pj后面的数得到(q) void Reverse(int array[],int length,int index) { vector<int> vec; int vecindex = 0; for(int i = length - 1; i > index ; i--) { vec.push_back(array[i]); } for(int j = index+1; j <= length -1;j++) { array[j] = vec[vecindex++]; } } //打印排列 void PrintArray(int array[],int length) { int i; for(i = 0 ; i < length-1 ; i++) printf("%d ",array[i]); printf("%d/n",array[i]); } /*生成array中数列的所有排列 ,array必须为递增序列, *考虑到通常array为非递增序列,我们对其进行了快速排序, *以保证程序的健壮性 */ //第一行是2个正整数n( 1 <= n < 1024 )和k(1<=k<=64), //第二行有n个正整数,是1,2 … n的一个排列 int main() { int m,n,k; int array[1030]; scanf("%d",&m); while(m--) { scanf("%d%d",&n,&k); int i,j; for(i=0;i<n;i++)scanf("%d",&array[i]); int length = n; int index1,index2; for(i=0;i<k;i++) { index1 = FindTheLastActiveSeq(array,length); index2 = FindTheLastBigger(array,length,index1); if(index1==-1||index2==-1){ sort(array,array+length);continue; } swap(array[index1],array[index2]); Reverse(array,length,index1); } PrintArray(array,length); } return 0; }