码迷,mamicode.com
首页 > 其他好文 > 详细

枚举排列

时间:2015-02-27 00:21:19      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:uva   暴力求解   枚举   排列   

输入正数n,按字典序从小到大的顺序输出n个数的所有排列。两个序列的字典序大小关系等价于从头开始第一个不相同位置处的大小关系。

一、生成1~n的排列

思路:

void print_permutation(序列A,集合S)

{

    if ( S 为空 )   输出序列 A;

    else  按照从小到大的顺序依次考虑 S 的每个元素 v

    {

          print_permutation(在A的末尾添加v后得到的新序列,S-{v});

    }

}

Code:

#include<stdio.h>
#include<stdlib.h>

void print_permutation(int n, int *A, int cur); 

int A[10];

int main()
{
  print_permutation(10,A,0);
  system("pause");
  return 0;
}

void print_permutation(int n, int *A, int cur)
{
  if(cur==n)
  {
    for(int i=0;i<n;++i) printf("%d ",A[i]);
    printf("\n");        
  }   
  else
  for(int i=1;i<=n;++i)
  {
    int ok=1;
    for(int j=1;j<cur;++j)
      if(i==A[j]) ok=0;
    if(ok)
    {
      A[cur]=i;
      print_permutation(n,A,cur+1);    
    }      
  }
}

二、生成可重集的排列

在一的基础上,首先要对输入数组P进行排序;再者一中元素不重复而这里可以重复,要统计次数;第三,对于输入1 1 1,只输出一次而不是多次,即对连续的相同元素,不能多次出现。

Code:

#include<stdio.h>
#include<stdlib.h>

int cmp_int(const void *_a, const void *_b);
void print_permutation2(int n, int *P, int *A, int cur);

int P[]={1,2,3,3,2,1,4};
int A[7];

int main()
{
  int n=7;
  qsort(P,7,sizeof(P[0]),cmp_int);
  print_permutation2(n,P,A,0);
  system("pause");
  return 0;
}

void print_permutation2(int n, int *P, int *A, int cur)
{
  if(cur==n)
  {
    for(int i=0;i<n;++i) printf("%d ",A[i]);
    printf("\n");        
  }
  else
  for(int i=0;i<n;++i)//遍历数组P的所有元素 
    if(!i||P[i]!=P[i-1])//连续的相同元素不枚举多次 
    {
      int c1=0,c2=0;
      for(int j=0;j<cur;++j) if(P[i]==A[j]) c1++;//P[i]在A数组中已出现的次数 
      for(int j=0;j<n;++j) if(P[i]==P[j]) c2++;//P[i]在P数组中共出现的次数 
      if(c1<c2)
      {
        A[cur]=P[i];
        print_permutation2(n,P,A,cur+1);       
      } 
    }
}

int cmp_int(const void *_a, const void *_b)
{
  return *(int*)_a - *(int*)_b;  
}

三、下一个排列

C++的STL中一个库函数 next_permutation()

Code:

#include<cstdio>
#include<cstdlib>
#include<algorithm>

using namespace std;

int main()
{
  int n,p[10];
  scanf("%d",&n);
  for(int i=0;i<n;++i) scanf("%d",&p[i]);
  sort(p,p+n);
  do
  {
    for(int i=0;i<n;++i) printf("%d ",p[i]);//输出排列p
    printf("\n");   
  }while(next_permutation(p,p+n));
  system("pause");
  return 0;  
}






枚举排列

标签:uva   暴力求解   枚举   排列   

原文地址:http://blog.csdn.net/buxizhizhou530/article/details/43958399

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!