《数据结构编程实验》 1.5.9排列

来源:互联网 发布:机械零件加工制作软件 编辑:程序博客网 时间:2024/06/11 17:47

题目大意:

  给出n个数的一个排列,求该排列按字典序的下k个排列。


题目地址:

  POJ  1833


题解:

  排列生成算法。从右往左数,第一个非递增的数字a,将a与它右边大于它的最小数b交换,交换后,将b右边的数字升序排列后,所得排列即为下一个排列。


#include <iostream>#include <cstdio>using namespace std;int swap(int &x,int &y){    int t;    t=x;    x=y;    y=t;    return 0;}int f(int a[],int n){    int i,j,k;    for (i=n-1;i>0;i--) if (a[i]<a[i+1]) break;    if (i==0) {for (i=1;i<=n;i++) a[i]=i;return 0;}    else for (j=i+1;j<=n;j++) if (a[j]<a[i]) break;    j--;    swap(a[i],a[j]);    for (j=i+1,k=n;j<k;j++,k--) swap(a[j],a[k]);    return 0;}int main(){    int a[1025];    int i;    int m,n,k;    scanf("%d",&m);    while (m--)    {        scanf("%d%d",&n,&k);        for (i=1;i<=n;i++) scanf("%d",&a[i]);        for (i=0;i<k;i++) f(a,n);        for (i=1;i<n;i++) printf("%d ",a[i]);        printf("%d\n",a[n]);    }    return 0;}


0 0
原创粉丝点击