暴力求解法 之 枚举排列

2014-11-23 23:21:23 · 作者: · 浏览: 6

1、生成1~n的排列


include  
#include  
const int N=1e3+10; 
int a[N]; 
void print_permutation(int n,int *a,int cur) 
{ 
    int i,j; 
    if(cur==n) /*递归边界*/ 
    { 
        for(i=0;i
#include
const int N=1e3+10;
int a[N];
void print_permutation(int n,int *a,int cur)
{
    int i,j;
    if(cur==n) /*递归边界*/
    {
        for(i=0;i 
 


2、生成可重集的排列

上面求排列的程序只适用于任意两个元素均不相同的序列,如果要求有元素相同的序列的排列时,则需要对上面的程序进行修改。

#include  
#include  
#include  
using namespace std; 
const int N=1e3+10; 
int a[N],p[N]; 
void print_permutation(int n,int *p,int *a,int cur) 
{ 
    int i,j; 
    if(cur==n) 
    { 
        for(i=0;i
#include
#include
using namespace std;
const int N=1e3+10;
int a[N],p[N];
void print_permutation(int n,int *p,int *a,int cur)
{
    int i,j;
    if(cur==n)
    {
        for(i=0;i 
 

3、求下一个排列

枚举所有排列的另一个方法是从字典序最小的排列开始,不停调用“求下一个排列”的过程。 如何求下一个排列呢?C++的STL中提供了一个库函数next_permutation。

 #include  
#include  
using namespace std; 
int main() 
{ 
    int n,i,p[10]; 
    while(~scanf("%d",&n)) 
    { 
        for(i=0;i
#include
using namespace std;
int main()
{
 int n,i,p[10];
 while(~scanf("%d",&n))
 {
  for(i=0;i