1. 递归生成1—n的全排列
示例程序:
#include<iostream>
using namespacestd;
void print(intn,int *A,int cur);
int main()
{
int num;
while(cin>>num)
{
int A[30];
print(num,A,0);
}
return 0;
}
void print(intn,int *A,int cur)
{
if(cur==n) //递归边界
{
for(int i=0; i<n; i++)
{
cout<<A[i]<<"";
}
cout<<endl;
}
else
{
for(int i=1; i<=n; i++) //在A[cur] 中填各种整数i
{
int ok=1;
for(int j=0; j<cur; j++)
{
if(A[j]==i) //如果i已经在A[0]-A[cur-1]中出现过,则不能再选
{
ok=0;
}
}
if(ok)
{
A[cur]=i;
print(n,A,cur+1); //递归调用
}
}
}
}
运行结果:
1
1
2
1 2
2 1
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
2. 输入数组P,并按字典序输出数组P的全排列.
示例程序:
#include<iostream>
#include<algorithm>
using namespacestd;
void print(intn,int *P,int *A,int cur);
int main()
{
int A[30];
int p[30];
int num,i=0;
while(cin>>num)
{
p[i++]=num;
}
sort(p,p+i);
print(i,p,A,0);
return 0;
}
void print(intn,int *p,int *A,int cur)
{
if(cur==n) //递归边界
{
for(int i=0; i<n; i++)
{
cout<<A[i]<<"";
}
cout<<endl;
}
else
{
/*
我们枚举的下标i应该不重复、不遗漏的取遍所有p[i]的值,由于P数组已经排过序,所以只需要检查P的第一个元素(!i)与所有“与前面一个元素不相同”的元素(p[i]!=p[i-1])
*/
for(int i=0; i<n; i++)
{
if(!i||p[i]!=p[i-1])//放在for循环的外部
{
int c1=0,c2=0;
for(int j=0; j<cur; j++)
{
if(A[j]==p[i])
{
c1++;//统计A[0]-A[cur-1]中P[i]的出现次数C1
}
}
for(int j=0; j<n; j++)
{
if(p[i]==p[j])
{
c2++;//统计P数组中P[i]的出现次数C2
}
}
if(c1<c2)//只要C1<c2,就能递归调用
{
A[cur]=p[i];
print(n,p,A,cur+1);
}
}
}
}
}
示例输入:
1 1 1 3
^Z
示例输出:
1 1 1 3
1 1 3 1
1 3 1 1
3 1 1 1
3. 使用STL的函数
示例程序:
#include<iostream>
#include<algorithm>
using namespacestd;
int main()
{
int p[30];
int num,i=0;
while(cin>>num)
{
p[i++]=num;
}
sort(p,p+i);
do
{
for(int j=0;j<i;j++)
{
cout<<p[j]<<"";
}
cout<<endl;
}
while(next_permutation(p,p+i));
return 0;
}
示例输入:
3 4 2 1
^Z
示例输出:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1