求有重复数字的全排列算法。

该博客探讨了如何修改一个现有的随机生成0到9之间数字并进行无重复全排列的算法,以实现包含重复数字的全排列。博主遇到了困难,希望得到专家的帮助来解决这个问题,分享了当前的C++代码实现。

我同一个随机函数得到0~9之间的任意数字然后进行全排列,可是我的这个算法却只能实现无重复数字的全排列,研究了半天没有结果,水平实在有限,希望高手帮我看看。。

#include <stdio.h>

#include <iostream.h>

#include <fstream.h>

#include <time.h>

#include "windows.h"

#include <conio.h>

#define MAX 10  //定义从09里随机取数.

int M;       //随机取出的数的个数

int deep;   //深度

int j=0;    //增加一个计数器,跟踪最终排列所在的位置

 

 void swap(int *a,int *b)

{

    int temp;

    temp=*a;

    *a=*b;

    *b=temp;

}

 void  print_it(int arr[])  

{ 

      ++j;   

      ofstream fout("D:/test.txt",ios::app); //将结果以文本输出

      fout<<j<<":";        

   for(int  i=0;i<M;i++)      

       fout<<arr[i]<<" ";

       fout<<endl;

}  

 

void   perm( int arr[], int deep=0)  

{  

  if(deep==M)   //   如果已经排到最后  

  {  

     print_it(arr);      //   打印数组     

     return;  

  }  

  for(int i=deep;i<M;i++)     //   对当前位置后的所有位置  

  {  

    swap(&arr[deep],&arr[i]);       //   交换位置  

    perm(arr,deep+1);             //   递归,继续后面的调用  

    swap(&arr[deep],&arr[i]);       //   在交换回来,保持原有的排列次序  

  }  

}  

 

void main()

{  

    cout<<"Input the amounts of the data:";

    cin>>M;

    srand((unsigned)time(NULL));       //srand()函数产生一个以当前时间开始的随机种子

    int *Array=new int[M];

       for(int i=0;i<M;i++)

       {  Array[i]=rand()%MAX;       //MAX为最大值,其随机域为0~MAX-1

          cout<<Array[i]<<" ";  

       }

     perm(Array,deep=0);

        delete []Array;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值