数学建模社区-数学中国

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

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

' _" Y1 Y1 E" A# g) W0 I5 N
) p6 q. `6 r3 n& @0 @* K' I$ z* }  }, p+ r2 c8 v, g7 d- Y
/*/ r8 a0 ?$ x: ~9 I5 |, ]
使用递归方法求全排列
: D, L" j# v4 A7 q2 B# s$ j*/
" G( |% v% i( V& d$ k8 k4 X, _  z! x- K! \+ j0 e
#include<stdio.h>
1 V( D& ~4 p4 E4 d3 Y5 d' F
: o# o5 [% c1 [- A' O# R& bint sum=0;3 `: s; s4 r) [0 @  h$ m
int main(){" M4 W9 ^, M2 z7 Y/ j; [' A# b2 t
        int n,i;
7 k; e$ H* P% X2 |8 b, ~2 f        char *p;4 e* @9 g- Q5 I4 {
        void perm(char *,int,int);3 p$ c/ f& v6 S
) B) f6 M$ c# d2 }4 B
        scanf("%d",&n);) I# J( D2 s$ d9 U( G
        p=new char[n];" J& I' S: F! O/ x( o/ T
        for(i=0;i<n;i++){: ]* d8 D0 N: z9 Y! a3 ?2 x: M% P
                getchar();
6 n# @  w# Y. c8 K+ I+ B! d                scanf("%c",p+i);
* O: _0 e2 J5 a5 e        }
; b* {/ r5 X. V! |: K: L
; w' C+ I; ~, L. l8 G2 d3 n        perm(p,0,n-1);
* a; y* v& @1 d$ A        printf("==>%d",sum);
! `7 g( P0 b1 T; M
( j7 e# [' H5 o4 X+ Q4 u        return 0;- s* q, B7 x9 R; ~! c. Z
}
" h* L- H+ l5 T( e7 J: c' \; p+ Z/ M/ Q# t% x: G
void perm(char *p,int s,int e){
0 g2 a3 h" \- M) S0 u; Z" g        int i;/ K, S" ^& Q! q
        void swap(char*,char*);- |1 m! B$ r4 I5 B) o5 ]4 @: A
        3 N( u, `' F( {5 N" O( B
        if(s==e){  m6 i4 C0 W/ r" C
                printf("%s\n",p);
4 |/ [3 f# S2 l- h                sum++;2 D/ v9 z$ h; y- G$ _4 Q, |  E7 k4 X; @
                return ;
1 D* p/ \  J" h+ N0 E        }4 p" s1 Q  x! V0 K1 R8 _0 m9 y
        else{# H# Q7 G% f$ S4 u  x. I8 e
                for(i=s;i<=e;i++){: w2 ]8 \. u- ?
                        swap(p+s,p+i);
- N9 @, y6 ?. ]                        perm(p,s+1,e);
3 C& _/ Z7 D- _& G3 {. X                        swap(p+s,p+i);
" j1 r  P0 S+ {5 `, y& p) i- q                }
# `. Z9 z' ~; Z( l) k6 ~* ~        }
( V0 Y9 D* G" U2 d' ^) {: X}4 p: w# m* j8 [  d$ y5 c( r8 K0 _

1 k( f3 r8 z0 K* A. q: @  ]void swap(char *a,char *b){$ s& ^8 n2 F8 |& ^& |- }# B9 N
        int tmp=*a;
% @, S6 U- c4 Y        *a=*b;
: \) G5 z" l/ M% P        *b=tmp;
4 b: i, D2 l7 m( J}
0 b: t+ k$ r" Q4 m5 a6 E9 M; n1 n
======================================================================
& o& `' ^- c) @. o6 A7 b" @    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。, E0 n# b  S# h; H0 W
    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!; L. b9 H1 a4 X( {( e! [+ G3 `6 f

" m: Y2 B( C4 d/ y3 N, @
( R& q1 q, |* u, h0 g
* f3 c/ Y' J/ _  d# s& r




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