怎么把它修改成(不重复)全排列组合...(递归实现)

时间:2022-11-15 16:06:12
这是网上找来的一段代码,算法不错,不过我研究了很长时间也不知道怎么把它   由全排列组合    改为(不重复)全排列组合

#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
char s[] = "abc";
int n = 3;
void order(int i)
{

if (i < n)
for (int j = i; j < n; j++) 
{
swap(s[i], s[j]);
order(i+1);
swap(s[i], s[j]);
}
else
cout << s << endl;
}
int main(int argc, char** argv) {
order(0);
return 0;
}


(个人认为)算法思想应该是这样的,i做为监视位,然后由j不断的与其交换,然后i再进位

9 个解决方案

#1


弱弱的问一下,什么叫不重复全排列组合?

#2


abc的排列是  abc acb bac bca cab cab

我在我输入 abb 输出是  abb bab bba

#3


我觉得,你可以从有重复子符的集合中,剔出重复的字符,
生成一个不重复字符的集合,再全排列就很直观了

#4


可是这样很消耗资源,而且排列数越多,资源也消耗的越大,时间正是无法忍受(曾试过)

比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了

#5


还不至于吧, 对集合先排序, 再剔出,用好的排序算法, 算法复杂度不会超过
 O(NlogN + N)

#6


哦   知道你的意思了  不过还是希望能在算法里直接去除吧

那样更加舒服点


其实就是 i与(i+1)  j与(j+1)  i与j   的比较     不过就是因为递归的存在(我对递归一直感到头疼),所以一直搞不定

#7


去看STL源码剖析。里面讲了全排列算法的原理。

#8


#include "iostream.h"
char *color[10]={"red","yellow","blue","white","black"};
int buffer[10];
void comb(int n,int m,int k,int count)
{
 if(m==0)
 {
  for(int j=0;j<3;j++)
  cout<<color[buffer[j]]<<" ";
  cout<<endl;
  }
 for(int i=k;i<=4;i++)
 {
   buffer[count]=i;
   comb(n,m-1,i+1,count+1);
  }
}  

void main()
{
  comb(5,3,0,0);  
}

#9


看错了 ke 以用一个辅助数组
visit[100]={0}
for (int j = i; j < n; j++) 
{
swap(s[i], s[j]);
if(visit[s[i]]) 
goto next:
order(i+1);
visit[s[i]]=1; 
swap(s[i], s[j]);
visit[s[i]=0;
next:
}


#1


弱弱的问一下,什么叫不重复全排列组合?

#2


abc的排列是  abc acb bac bca cab cab

我在我输入 abb 输出是  abb bab bba

#3


我觉得,你可以从有重复子符的集合中,剔出重复的字符,
生成一个不重复字符的集合,再全排列就很直观了

#4


可是这样很消耗资源,而且排列数越多,资源也消耗的越大,时间正是无法忍受(曾试过)

比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了

#5


还不至于吧, 对集合先排序, 再剔出,用好的排序算法, 算法复杂度不会超过
 O(NlogN + N)

#6


哦   知道你的意思了  不过还是希望能在算法里直接去除吧

那样更加舒服点


其实就是 i与(i+1)  j与(j+1)  i与j   的比较     不过就是因为递归的存在(我对递归一直感到头疼),所以一直搞不定

#7


去看STL源码剖析。里面讲了全排列算法的原理。

#8


#include "iostream.h"
char *color[10]={"red","yellow","blue","white","black"};
int buffer[10];
void comb(int n,int m,int k,int count)
{
 if(m==0)
 {
  for(int j=0;j<3;j++)
  cout<<color[buffer[j]]<<" ";
  cout<<endl;
  }
 for(int i=k;i<=4;i++)
 {
   buffer[count]=i;
   comb(n,m-1,i+1,count+1);
  }
}  

void main()
{
  comb(5,3,0,0);  
}

#9


看错了 ke 以用一个辅助数组
visit[100]={0}
for (int j = i; j < n; j++) 
{
swap(s[i], s[j]);
if(visit[s[i]]) 
goto next:
order(i+1);
visit[s[i]]=1; 
swap(s[i], s[j]);
visit[s[i]=0;
next:
}