#include<iostream>
using namespace std;
#define MAX 100000
int count;
int p[MAX];//下标从1开始用
int FindI()//寻找最大的i
{
int i=0;
for(int j=2;j<=count;j++)
{
if(p[j-1]<p[j])
{
if(j>i)
{
i=j;
}
}
}
return i;
}
int FindJ(int i)//寻找最大的j
{
int j=0;
for(int k=1;k<=count;k++)
{
if(p[i-1]<p[k])
{
if(k>j)
{
j=k;
}
}
}
return j;
}
void ChangePos(int i,int j)//交换p[i-1]与p[j]的位置
{
int temp =p[i-1];
p[i-1]=p[j];
p[j] = temp;
}
void Trans(int i)//翻转n到i元素
{
for(int k=count;k>i+(count-i)/2;k--)
{
int temp = p[k];
p[k] = p[i+count-k];
p[i+count-k] = temp;
}
}
void Print(int count)//打印所有元素
{
for(int i=1;i<=count;i++)
{
cout<<p[i]<<" ";
}
cout<<endl;
}
int f(int n)//用于计算组合数的个数
{
if(n==0||n==1)
return 1;
else
return n*f(n-1);
}
int main()
{
cin>>count;
int num=f(count);
for(int s=1;s<=count;s++)
{
p[s]=s;
}
cout<<"1: ";
Print(count);
for(int q=2;q<=num;q++)
{
int i=0;
int j=0;
i=FindI();
j=FindJ(i);
// cout<<temp<<endl;
// cout<<FindJ(temp)<<endl;
ChangePos(i,j);
Trans(i);
cout<<q<<": ";
Print(count);
}
return 0;
}
排列的生成算法 字典序
最新推荐文章于 2022-06-02 00:33:55 发布