Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1519937
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-12-12 20:14:43

例如排列112253321的下一个稍大的排列是112312235。
也就是说,任给一个排列,我可以找到一个比它稍大的排列,因此只要给我最小的那个排列(对本例来说即111222335),则我可以依次找出所有排列。
(注:由112253321计算出112312235的算法是:
先从右往左找,后五个数一直都上升,直到2处首次下降。
将2与后面比其稍大的数3互换得到112353221
然后将后五个数倒序即得到112312235.)
 
 
 
 
/*输出给排列及更大的所有排列*/
#include
#define N 5
print(int a[])//打印排列
{   
 for(int z=0;z<=N-1;z++)
  cout< cout<}
bool nextlin(int a[])//生成下一个排列
{
 int i,j,k;
    for(i=N-2;i>=0;i--)//从后往前走
 {
  if(a[i]   break;
 }//i定位在第一个降数
 if(i==-1)//说明左->右一直升
 {
  return false;//返回false说明没有下一个了
 }
 int remberi=i;//把i值记录下来
 for(j=N-1;j>=remberi+1;j--)//在N-1至remberi+1段上从左往右走
 {
  if(a[j]>a[remberi])
   break;
 }//找到第一个大于a[remberi]的数a[j]
 //交换a[j]与a[remberi]
 int temp=a[remberi];
 a[remberi]=a[j];
 a[j]=temp;
 remberi++;//remberi前是一步
 //将前当remberi至N-1段反序
 for(k=1;k<=(N-remberi)/2;k++)
 {
  int temp=a[remberi+k-1];
  a[remberi+k-1]=a[N-k];
  a[N-k]=temp;
 }
 return true;//反回true说明计算下一个排列成功
}
main()
{
 int a[N];
 cout<<"input "< for(int z=0;z<=N-1;z++)
  cin>>a[z];
 print(a); 
 int count=1;
 while(nextlin(a)!=false)
 {
  print(a);
  count++;
 }
 cout<<"共"<
}
阅读(654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~