软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 电脑教程 > 编程开发 > C/C++开发 > C++代码片段:生成排列算法

C++代码片段:生成排列算法

C++代码片段:生成排列算法,本算法是组合数学中的生成排列算法。
编译环境:windows平台 Dev C++ 编译通过。

代码片段:

Copy to ClipboardLiehuo.Net Codes引用的内容:[www.veryhuo.com]
#include<iostream>

using namespace std;
int num[10];
bool dir[10];
__int64 Array[3628805];
int find()//找出排列数中活跃的项
{
int Max=-1;
int index=-1;
for(int i=0;i<10;i++)
{
if(dir[num[i]]==1)
{
if(i!=0)
{
if(num[i]>num[i-1])
{
if(num[i]>Max)
{
Max=num[i];
index=i;
}
}
}
}else
{
if(i!=9)
{
if(num[i]>num[i+1])
{
if(num[i]>Max)
{
Max=num[i];
index=i;
}
}
}
}
}
return index;
}
void changedir(int n)//改变排列数方向
{
for(int i=n+1;i<10;i++)
dir[i]=!dir[i];
}
void Print(int cnt)//转换成整型
{
Array[cnt]=0;
for(int i=0;i<10;i++)
Array[cnt]=Array[cnt]*10+num[i];
}
int main()
{
freopen("out.txt","w",stdout);
for(int i=0;i<10;i++)
{
dir[i]=1;
num[i]=i;
}
int cnt=1;
while(1)
{
Print(cnt-1);
int index=find();
if(index==-1)//最后一个排列已经生成则返回-1 退出
break;
int N=num[index];
if(dir[N]==1)
swap(num[index],num[index-1]);
else
swap(num[index],num[index+1]);
changedir(N);//反转排列数中大于N的数方向
cnt++;
}
printf("cnt = %d\n",cnt);
for(int i=0;i<cnt;i++)
printf("%I64d\n",Array[i]);
return 0;
}
    相关阅读
    网友评论