数学建模社区-数学中国

标题: 算法:求全排列的递归算法 [打印本页]

作者: 知道了    时间: 2015-4-16 14:28
标题: 算法:求全排列的递归算法

7 |  P3 Q0 u& a' b% A. U# e
0 y- K5 @, k/ ~. k
6 i8 j7 z# l. @5 H3 o- J/*
* U! e- Q7 t5 D5 ]使用递归方法求全排列% x5 C3 }1 ]$ M# G7 [9 u2 O
*/
) s3 F8 s. k1 }" P. B% p
0 e  e1 t: O; O) C* [5 g#include<stdio.h>
2 D( b2 i( ~0 c: f. |& @; e% |* N- H
int sum=0;
, |: \( m8 [) W# C5 jint main(){
9 m5 }# U' C9 E; z- G: g; B; x4 C( y: m        int n,i;
' f+ {# ]  b; j$ y* h7 h        char *p;+ W, p; _! A' ~3 B
        void perm(char *,int,int);. w9 E) f$ Y. \8 o

2 O3 [& m5 ]3 n/ Z9 N        scanf("%d",&n);& G* c7 p5 }9 r5 q8 b' P
        p=new char[n];& u# ^! B2 Z& m) U
        for(i=0;i<n;i++){
$ K; N3 v7 u0 c3 A4 F                getchar();
) d) O: D) f! t! ~1 q! _                scanf("%c",p+i);+ B' H9 J0 n+ T/ o) |6 J
        }
9 _+ M! Q; N6 F' N! Q6 s
# s% \6 k7 Z2 B* f        perm(p,0,n-1);* u5 {* T$ G2 u
        printf("==>%d",sum);2 L6 S$ d3 ?# j1 t# e; C

- X1 E, G' n( q' p  p3 t        return 0;6 Y0 N6 g$ Q0 E8 P2 b
}
; F: P6 L" Z+ ^1 n
4 n9 m+ V6 R9 E8 p2 O; Bvoid perm(char *p,int s,int e){/ X- S9 ]; g9 D7 `, j) a
        int i;
5 c* ~  i/ D/ j- h: i        void swap(char*,char*);2 S& |% c0 F- b  r, d
        
* f4 q9 s1 ^6 R; S' l        if(s==e){
) ^, C* o* V4 i) G                printf("%s\n",p);6 W' o: v7 I& g: `/ }% {. @
                sum++;
' ]8 V0 F6 R# l) @! J                return ;% n; V: h3 v9 M$ c9 o
        }* J1 t* e5 k  S/ v* i1 _% d; w
        else{
5 d% ^; C4 a4 X% q* }  O                for(i=s;i<=e;i++){
1 N; [% B2 X  [, b2 y                        swap(p+s,p+i);+ ], g/ O+ d' G6 G3 k. ]
                        perm(p,s+1,e);5 C- V9 z) _- p8 f/ G
                        swap(p+s,p+i);, Z! g  H+ r! l* J$ j6 H0 ]
                }( B; g- t7 Q1 h' W. j2 p" D
        }
. v3 I. h* T2 X6 [% Z}
4 l" O% @2 N7 a) T6 z9 B9 w- P, |% e! q" N8 ?6 W. X; D$ x; @
void swap(char *a,char *b){
& E2 ?' V9 r( A        int tmp=*a;
% v. G; j+ W3 k. u, S4 l) d" m9 Z        *a=*b;. E, G2 J2 U2 S; i  c
        *b=tmp;
0 I+ I; b3 B" F: N' y. M}: R% S/ q7 z  h

  b" C; l8 \/ ^& m# R% k" I1 p======================================================================' ^: O# C  `" \, B, z
    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
: J+ Z$ B: W, S    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
3 L3 E- v- L6 G( ?% Z4 @. q- x$ e1 `/ Q) c4 |
) d* B% A1 T" s) t1 B+ `

" }" D& ^6 Q0 h0 ]9 ^. P




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5