对一些数的排列和组合在编程中是非常常用的,现在对全排列及其一些变形总结到这儿 。
其实也就是深搜的思想,深搜得到一颗搜索树,然后在上面做一些题目要求的操作。
**给出一个数n,打印1-n形成的一个全排列
#include <iostream>
using namespace std;
int a[50];
void print_permutation(int n,int *s,int cur)
{
if(cur==n) ///打印
{
for(int i=0;i<n;i++)
{
if(i==n-1)
cout<<s[i];
else
cout<<s[i]<<" ";
}
cout<<endl;
}
else
{
for(int i=1;i<=n;i++)
{
int ok=1;
for(int j=0;j<cur;j++) //枚举没有出现的
{
if(s[j]==i) ok=0;
}
if(ok)
{
s[cur]=i;
print_permutation(n,s,cur+1); ///递归
}
}
}
}
int main()
{
int T,n;
cin>>T;
while(T--)
{
cin>>n;
print_permutation(n,a,0);
}
return 0;
}
**用STL中next_permutation 实现
#include <iostream>
#include <algorithm>
using namespace std;
int a[50];
int main()
{
int T,n;
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i-1];
}
do
{
for(int i=0;i<n;i++)
{
if(i==n-1)
cout<<a[i];
else
cout<<a[i]<<" ";
}
cout<<endl;
}while(next_permutation(a,a+n));
}
return 0;
}
**通过递归实现形成一个排列树,打印任意数的全排列
#include <iostream>
#include <algorithm>
using namespace std;
int a[50];
void print_permutation(int n,int *p,int *s,int cur)
{
if(cur==n) //打印结果
{
for(int i=0;i<n;i++)
{
cout<<s[i]<<" ";
}
cout<<endl;
}
else
{
for(int i=0;i<n;i++)
if(!i || p[i] != p[i-1])
{
int c1=0,c2=0;
for(int j=0;j<cur;j++)
{
if(s[j]==p[i]) c1++;
}
for(int j=0;j<n;j++)
{
if(p[i]==p[j]) c2++;
}
if(c1<c2)
{
s[cur]=p[i];
print_permutation(n,p,s,cur+1);
}
}
}
}
int main()
{
int p[50];
int T,n;
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>p[i];
sort(p,p+n);
print_permutation(n,p,a,0);
}
return 0;
}
/***
5
4
5 7 8 9
5
4 4 5 6 8
***/
** 变形,求出 nyoj469擅长排列的小明 II
1、第一个数必须是1
2、相邻两个数之差不大于2
满足这两个条件的一个1 -- n 的全排列 。用上面的方法肯定超时,其实是一个公式:a[56] = {0,1,1,2}; a[i] = a[i-1] + a[i-3] + 1;
**变形,求出1 -- n中选出 m 个数字让他继续全排列 nyoj19擅长排列的小明
#include <iostream>
using namespace std;
int a[50];
void print_permutation(int m,int n,int *s,int cur)
{
if(cur==m) ///打印
{
for(int i=0;i<m;i++)
{
cout<<s[i];
}
cout<<endl;
}
else
{
for(int i=0;i<n;i++)
{
int ok=1;
for(int j=0;j<cur;j++) //枚举没有出现的
{
if(s[j]==i+1) ok=0;
}
if(ok)
{
s[cur]=i+1;
print_permutation(m,n,s,cur+1); ///递归
}
}
}
}
int main()
{
int T,n,m;
cin>>T;
while(T--)
{
cin>>n>>m;
print_permutation(m,n,a,0);
}
return 0;
}