#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
我在我输入 abb 输出是 abb bab bba
#3
我觉得,你可以从有重复子符的集合中,剔出重复的字符,
生成一个不重复字符的集合,再全排列就很直观了
生成一个不重复字符的集合,再全排列就很直观了
#4
可是这样很消耗资源,而且排列数越多,资源也消耗的越大,时间正是无法忍受(曾试过)
比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了
比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了
#5
还不至于吧, 对集合先排序, 再剔出,用好的排序算法, 算法复杂度不会超过
O(NlogN + N)
O(NlogN + N)
#6
哦 知道你的意思了 不过还是希望能在算法里直接去除吧
那样更加舒服点
其实就是 i与(i+1) j与(j+1) i与j 的比较 不过就是因为递归的存在(我对递归一直感到头疼),所以一直搞不定
那样更加舒服点
其实就是 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);
}
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:
}
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
我在我输入 abb 输出是 abb bab bba
#3
我觉得,你可以从有重复子符的集合中,剔出重复的字符,
生成一个不重复字符的集合,再全排列就很直观了
生成一个不重复字符的集合,再全排列就很直观了
#4
可是这样很消耗资源,而且排列数越多,资源也消耗的越大,时间正是无法忍受(曾试过)
比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了
比如有10000组排列就要比较 1+2+3+.....9999次,算法太烂了
#5
还不至于吧, 对集合先排序, 再剔出,用好的排序算法, 算法复杂度不会超过
O(NlogN + N)
O(NlogN + N)
#6
哦 知道你的意思了 不过还是希望能在算法里直接去除吧
那样更加舒服点
其实就是 i与(i+1) j与(j+1) i与j 的比较 不过就是因为递归的存在(我对递归一直感到头疼),所以一直搞不定
那样更加舒服点
其实就是 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);
}
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:
}
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:
}