全排列模板

一,递归实现

1,不去重

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 using namespace std;
 5 void permutation(char *s,int d,int l)
 6 {
 7     if(d==l-1)
 8     {
 9         puts(s);
10         return ;
11     }
12     else
13     {
14         for(int i=d;i<l;i++)
15         {
16             swap(s[i],s[d]);
17             permutation(s,d+1,l);
18             swap(s[i],s[d]);
19         }
20     }
21 }
22 int main()
23 {
24     char s[]="123";
25     printf("123µÄÈ«ÅÅÁÐΪ:\n");
26     permutation(s,0,3);
27     char s2[]="122";
28     printf("122µÄÈ«ÅÅÁÐΪ:\n");
29     permutation(s2,0,3);
30     return 0;
31 }

2,去重

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 using namespace std;
 5 bool pd(char *s,int l,int r)
 6 {
 7     for(int i=l;i<r;i++)
 8         if(s[i]==s[r])
 9             return false;
10     return true;
11 }
12 void permutation(char *s,int d,int l)
13 {
14     if(d==l-1)
15     {
16         puts(s);
17         return ;
18     }
19     else
20     {
21         for(int i=d;i<l;i++)
22         {
23             if(pd(s,d,i))
24             {
25                 swap(s[i],s[d]);
26                 permutation(s,d+1,l);
27                 swap(s[i],s[d]);
28             }
29
30         }
31     }
32 }
33 int main()
34 {
35     char s[]="123";
36     printf("123µÄÈ«ÅÅÁÐΪ:\n");
37     permutation(s,0,3);
38     char s2[]="1233";
39     printf("1233µÄÈ«ÅÅÁÐΪ:\n");
40     permutation(s2,0,4);
41     return 0;
42 }

二,STL实现(去重)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 void permutation(char *s,int l)
 7 {
 8     sort(s,s+l);
 9     do
10     {
11         for(int i=0;i<l;i++)
12             putchar(s[i]);
13         puts("");
14     }while(next_permutation(s,s+l));
15 }
16 int main()
17 {
18     char s[]="123";
19     printf("123µÄÈ«ÅÅÁÐΪ:\n");
20     permutation(s,3);
21     char s2[]="1233";
22     printf("1233µÄÈ«ÅÅÁÐΪ:\n");
23     permutation(s2,4);
24     return 0;
25 } 

参考文章:http://blog.csdn.net/hackbuteer1/article/details/6657435

时间: 2024-10-28 06:26:57

全排列模板的相关文章

历届试题 带分数_JAVA_全排列模板

标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0). 类似这样的带分数,100 有 11 种表示法. 题目要求:从标准输入读入一个正整数N (N<1000*1000)程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数.注意:不要求输出每个表示,只统计有多少表示法! 例如:用户输入:100程序输出:11 再例如:用户输入:10

lightoj-1023 - Discovering Permutations(全排列)

1023 - Discovering Permutations PDF (English) Statistics ForumTime Limit: 0.5 second(s) Memory Limit: 32 MBIn this problem you have to find the permutations using the first N English capital letters. Since there can be many permutations, you have to

整理,模板

组合数学.-排列组合数----sum求sum=sum*(m--)/i;int c(int n,int m)//n下标,m上标{    int sum=1;    for(int i=1;i<=m;i++)        sum=sum*(n--)/i;    return sum;}----二维数组递推(打表)#define maxx 1000int c[maxx+2][maxx+2];void init()//递推打表{    memset(c,0,sizeof(c));    c[0][0]

组合数学笔记

组合数学.-排列组合数----sum求sum=sum*(m--)/i;----二维数组递推(打表)---原始公式(单个)数字太大,用分子分母约分-全排列模板-----生成全排列函数prev_permutation和next_permutation区别http://www.cnblogs.com/zhengyuhong/archive/2012/02/28/2371615.html--母函数模板---用的时候一般会变一下数,式子中等阶指数(xiayige)--错排错位排列的公式有dn=n!(1-1

递归算法:求序列的全排列

用C++模板书写一段序列数组的全部排列 /** * 书本:[windows程序设计] * 功能:输出全部的排列情况 * 文件:全排列.cpp * 时间:2014年9月29日21:52:55 * 作者:cutter_point */ #include <iostream> using namespace std; //交换两个元素的函数 template<class Type> inline void Swap(Type &a, Type &b) //取两个元素的引用

《编程之法》1.3字符串的全排列,组合,重复排列,八皇后问题

题目描述:输入一个字符串,打印出该字符串中字符的所有排列,例如输入"abc",输出"abc","acb","bac","bca","cab","cba" 解法一:递归实现 类似于图的深度遍历搜索求全路径的算法,每次交换两个数,并输出,按照递归的方法,如求abcd的全排序,1:先求abcd后面的bcd全排列(同样先求b后面cd的全排列,然后b与后面的元素依次交换);2:

C++ STL 全排列函数详解

一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a,b,c的全排列一共有3!= 6 种 分别是{a, b, c}.{a, c, b}.{b, a, c}.{b, c, a}.{c, a, b}.{c, b, a}. 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 这里先说两个概念:"下一个排列组合&qu

Lotto POJ2245【全排列问题】

Problem Description In the German Lotto you have to select 6 numbers from the set {1,2,...,49}. A popular strategy to play Lotto - although it doesn't increase your chance of winning - is to select a subset S containing k (k > 6) of these 49 numbers,

全排列 递归实现

前面我们介绍了全排列的非递归算法,现在我再来写一下全排列的递归算法: 这两种算法的算法思路并不相同.递归算法的思路比较接近于我们现实生活中的思路. 1.试想,我们只有两个数字:12.要对它进行全排列,第一种方式就是12本身,第二种,将12交换,变为21即可.这提示了我们一种交换的思路. 2.但这概括的并不全面.试想,我们要对123进行全排列.我们可以采用将1固定,"23"进行全排列,将"2"固定,对"13"进行全排列.将"3"