递归回溯生成全排列模板,适用于无重复元素的情况:
void f(int k)
{
if(k==n)//n是范围数 数组下标从0开始
{if(check()) ans++;}//符合题目条件的话,ans就++
int t=0;
for(int i=k;i<n;++i)
{{t=a[i];a[i]=a[k];a[k]=t;}
f(k+1);//递归
{t=a[i];a[i]=a[k];a[k]=t;}//回溯
}
若有重复元素,则:
bool isrepeat(int a[],int begin,int end)
{
for(int i=begin;i<end;++i)
{
if(a[i]==a[end]) return false;
}
return true;
}
void f(int k)
{
if(k==n)//n是范围数 数组下标从0开始
{if(check()) ans++;}//符合题目条件的话,ans就++
int t=0;
for(int i=k;i<n;++i)
{
if(isrepeat())
{
{t=a[i];a[i]=a[k];a[k]=t;}
f(k+1);//递归
{t=a[i];a[i]=a[k];a[k]=t;}//回溯
}
}
上面是手写算法,一般来讲不会超时,但是STL库里面也有关于全排列的函数,在填空的时候可以用:next_permutation
#include <algorithm>
bool next_permutation(iterator start,iterator end)
但是用这个函数前必须保证序列是从小到大排好序的
例子:
#include <iostream>
#include <algorithm>
using namespace std;
int a[]={1,2,3,4,5};
int main()
{
do{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<" "<<a[4]<<" "<<endl;
}while(next_permutation(a,a+5);
return 0;
}