本文共 908 字,大约阅读时间需要 3 分钟。
#include#include #include #include #define N 100010using namespace std;int a[N];int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); while(m--) next_permutation(a+1,a+n+1); for(int i=1;i<=n;i++) printf("%d ",a[i]);}
手动版
#include#include #include #include #define N 100010using namespace std;int a[N],n,m;void next(){ int now = a[n],p=n; //从后面往前面找到第一个now比a[p-1]大的位置 while(now =p;i--) if(a[i]>a[k]) break; swap(a[k],a[i]); //注意交换时边界没有等号 for(i=n;i>(p+n)/2;i--) swap(a[i],a[n+p-i]);}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); while(m--){ next(); } for(int i=1;i<=n;i++) printf("%d ",a[i]);}
接下来讲解康拓展开
可参考转载地址:http://mllzi.baihongyu.com/