void swap(char *a, char *b)
{
char t = *a;
*a = *b;
*b = t;
}
void permutation(char *c, int l, int r)//[l,r)
{
if (l == r)
{
cout<<c<<endl;
return;
}
for (int i = l; i < r; ++i)
{
//cout<<c[i];
swap(&c[l], &c[i]);
permutation(c, l+1, r);
swap(&c[l], &c[i]);
}
}
生成可重排列(先对in排序)
void permutation(const char *in, char *out, int l, int r)//[l,r)
{
int i, j, k, c1, c2;
if (l == r)
{
cout<<out<<endl;
}
else
for (i = 0; i < r; ++i)
{
c1 = 0;
c2 = 0;
for (k = 0; k < l; ++k)
{
if (in[i] == out[k])
{
++c1;
}
}
for (k = 0; k < r; ++k)
{
if (in[i] == in[k])
{
++c2;
}
}
if (c1 < c2 && (!i || in[i-1] != in[i]))
{
out[l] = in[i];
permutation(in, out, l+1, r);
}
}
}
非递归生成
int len = strlen(in);
sort(in, in+len);
do
{
printf("%s\n", in);
} while (next_permutation(in, in+len));