搜索---全排列
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索---全排列相关的知识,希望对你有一定的参考价值。
next_permutation() :
全排列函数
1.使用前应对用sort()
进行排序,得到最小排列。
2.排列是在排序后的最小排列的基础上进行操作。比如1,2,3,只会排列5次+最小排列,共计6次。
3. (a+m,a+n)
指从数组下表为m到n-1的数进行全排列。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[4]= {1,2,3,4};
while(next_permutation(a,a+4))
{
for(int i=0; i<4; i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
建议使用 do while
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[4]= {2,3,1,4};
sort(a,a+4);
do
{
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
}
while(next_permutation(a,a+4));
return 0;
}
递归实现全排列:
#include<iostream>
#include<algorithm>
using namespace std;
int a[]={1,2,3,4};
int num=0;
int perm(int begin,int end)
{
if(begin==end)
{
for(int g=0;g<4;g++)
cout<<a[g]<<" ";
cout<<endl;
num++;
}
else
{
for(int i=begin;i<=end;i++)
{
swap(a[begin],a[i]);
perm(begin+1,end);
swap(a[begin],a[i]);
}
}
}
int main()
{
perm(0,3);
cout<<num<<endl;
return 0;
}
全排列元素应该小于11个,否则会超过计算机的运行能力。
int main()
{
//perm(0,3);
//cout<<num<<endl;
clock_t start,end;
start=clock();
perm(0,9);
end=clock();
cout<<(double)(end-start)/CLOCKS_PER_SEC<<endl; //统计时间
return 0;
}
n个数选取m个数进行全排列
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
int a[15]; //最多只能有11个
int m,n,num;
void perm(int begin,int end)
{
if(begin==m)
{
num++;
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else
{
for(int i=begin;i<=end;i++)
{
swap(a[begin],a[i]);
perm(begin+1,end);
swap(a[begin],a[i]);
}
}
}
int main()
{
cin>>m>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
num=0;
perm(0,n-1);
cout<<num<<endl;
return 0;
}
以上是关于搜索---全排列的主要内容,如果未能解决你的问题,请参考以下文章