打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
高效率的全排列算法——N进制方法实现

高效率的全排列算法——N进制方法实现

分类: 基本算法 (C++) 1099人阅读 评论(2) 收藏 举报

算法描述:

 

全排列N进制算法——

从1到N,输出全排列,共N!条。
分析:用N进制的方法。设一个N个单元的数组a用来存放待全排列的数组的下标,对第一个单元做加一操作,满N进一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没有(且数组a中没有值为N的元素)则说明得到了一个排列方案。

 

例如:求1-3的全排列,共3!条
设数组初始状态为0 0 0,以下为计算全排列的步骤:

0 0 0 +1
1 0 0 +1
2 0 0 +1
3 0 0 满3进1 ->
0 1 0 +1
1 1 0 +1
2 1 0 +1
3 1 0 满3进1 ->
0 2 0 +1
1 2 0 +1
2 2 0 +1
3 2 0 满3进1 ->
0 3 0 满3进1 ->
0 0 1 +1
1 0 1 +1
2 0 1 +1
3 0 1 满3进1 ->
0 1 1 +1
1 1 1 +1
2 1 1 +1
3 1 1 满3进1 ->
0 2 1 +1
1 2 1 +1
2 2 1 +1
3 2 1 满3进1 ->
0 3 1 满3进1 ->
0 0 2 +1
1 0 2 +1
2 0 2 +1
3 0 2 满3进1 ->
0 1 2 +1
1 1 2 +1
2 1 2 +1
3 1 2 满3进1 ->
0 2 2 +1
1 2 2 +1
2 2 2 +1
3 2 2 满3进1 ->
0 3 2 满3进1 ->
0 0 3 满3进1 ->   (最高位为进制n(这里是3)是循环退出条件)
0 0 0

 

其中用红色背景色表明的6个下标序列是合格的,每一个下标序列对应一种排列。

 

 

 

实现如下:

===============================

 

#include <iostream>
using namespace std;

 

//若下标序列中出现进制n或者序列有重复的数字,返回真
bool CheckSame(int *a,int n)
{
 for(int i=0;i<n-1;i++)
 {
  if(a[i] == n)
   return true;
  for(int j=i+1;j<n;j++)
   if(a[i] == a[j])
    return true;
 }
 return false;
}


int main()
{
 int n;
 char c = 'y';
 while(c == 'y')
 {
  cout<<"Input N:";
  cin>>n;
  int *a = new int[n]; //数组a用来存下标
  //数组b用来存实际待排列的数字,也可以手工任意定义
  int *b = new int[n];
  for(int i=0;i<n;i++)
  {
   a[i] = 0;
   b[i] = i+1;
  }
  int count = 0;    //存放总的排列数目
  while(a[n-1] != n)  //最高位为进制n是循环退出条件
  {
   //先打印当前的全排列
   if(!CheckSame(a,n))
   {
    for(int i=0;i<n;i++)
    {
     cout<<b[a[i]]<<" ";
     if(i == n-1)
      count++;
    }
    cout<<endl;
   }
   //完成进位
   bool increase = false;
   for(int i=0;i<n-1;i++)
   {
    //如果有那位是n,则完成进位
    if(a[i] == n)
    {
     a[i] = 0;
     a[i+1]++;
     increase = true; //进过位
     break;
    }
   }
   //如果没有进过位,则使最低位加1
   if(!increase)
    a[0]++;
  }
  cout<<"Total number is:"<<count<<endl;
  delete []a;
  delete []b;
  a = b = NULL;
  cout<<"Continue?(y/n):";
  cin>>c;
 }
 return 0;
}

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据结构——堆PTA习题
KMP字符串模式匹配
求两个数组的交集、并集和差集算法分析与实现
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
排序算法总结
算法19(判断整数序列是不是二元查找树的后序遍历结果)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服