QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1716|回复: 0
打印 上一主题 下一主题

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

[复制链接]
字体大小: 正常 放大
知道了        

14

主题

9

听众

49

积分

升级  46.32%

  • TA的每日心情
    擦汗
    2015-5-5 09:17
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    9 R1 D9 p  v0 s$ K# I' ]
    $ o& X2 V& V! [
    : y. J7 L! L3 [$ i: x% n/ V
    /*! y. t$ q) U( K# B9 s7 q
    使用递归方法求全排列' D% S# W' c& Q: m$ H6 P* c
    */
    7 i& R& j0 i# k. w# s& X2 c5 J9 ~6 H' d$ ~4 Y$ E
    #include<stdio.h>: }0 F% A3 E" H
    ' s4 e1 t# K. k! T- r" o
    int sum=0;
    5 V  M* r5 b" U3 ]' b5 @! B" Lint main(){
    ! h$ f$ z( w6 `# O) s+ A0 ^        int n,i;
    # ?2 e8 R2 a8 h# ?& {$ b        char *p;" L! G( l4 Z% V% K
            void perm(char *,int,int);4 b2 y" Q# c1 X* g. W. J' t: e/ D
    ! M% J$ }* r1 P& K1 M, M
            scanf("%d",&n);
    - y6 u7 M1 N+ e- d7 U+ r2 v        p=new char[n];  b  E$ C9 k6 }, k5 n' D
            for(i=0;i<n;i++){, P6 x1 a4 B% t# X* o4 f3 Q
                    getchar();
    : m, f9 A7 t0 i                scanf("%c",p+i);
    : D: V; F; x2 {& L% n2 P4 g        }
    ) H( `9 u/ A. O  T2 B6 y
    / W/ X. X1 i; j9 P) c        perm(p,0,n-1);( J  I- w1 O7 r  N2 I/ E
            printf("==>%d",sum);
    # [7 ^* v+ _) t0 s. l2 g2 [# c& q! |% l* z$ r7 h9 @# s
            return 0;# k3 C4 |1 T0 x$ Q3 C5 ^
    }  |, @+ q4 `' p# K# T, L4 C* z* J
    3 |# v+ `2 y6 |% y
    void perm(char *p,int s,int e){8 {  }9 h" p- B; l  f
            int i;! c" x& q0 L" p
            void swap(char*,char*);
    7 j7 n) A; M+ I9 \, y  g        7 s  H8 F4 s  a8 S, `- F
            if(s==e){
    2 Y- K) B( Q; |                printf("%s\n",p);" O2 g8 V2 e. S4 f5 }3 k/ I
                    sum++;0 f+ J+ `+ ~. a& @
                    return ;
    , h' Y; G% E8 a+ T        }
    " x# t' H* F* n3 [5 e7 ^        else{
    3 L+ C4 N5 i: |; |& d                for(i=s;i<=e;i++){& k% g6 [) V9 F, _5 y
                            swap(p+s,p+i);
    ( {% M  ^' u& f3 b                        perm(p,s+1,e);$ {: |; y% M4 _3 p4 P6 k
                            swap(p+s,p+i);
    2 @6 M; g; o) ]2 T                }
    % W7 y5 Z. O: \/ a2 R1 x        }. ~8 X0 \6 u/ I' m5 ~( S5 F
    }& T; K% L* l" F6 J) W7 _

    2 u+ G' w' C% ]4 gvoid swap(char *a,char *b){
    + j2 S+ [; L* x1 n1 W* v        int tmp=*a;6 [7 L5 ~2 S5 L4 `9 \
            *a=*b;
      P" B4 `3 P. u. |+ S! G2 d+ X        *b=tmp;
    4 H) j' H/ D% A1 w& j}
    $ Y$ i  ^" @4 Q, U4 D
    $ u. R) D3 u# E# i5 U======================================================================1 f/ P9 y2 c3 V9 u* m
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    2 f! X; D2 |: I9 b! c; g    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!; C6 Y* @/ c* A+ I8 R; R: G( S

    8 {6 L  s! {0 A+ G# O# v+ S1 G" f" x
    % s5 a" y2 @9 V' h+ d! }* [( K' X
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-14 00:23 , Processed in 0.662516 second(s), 55 queries .

    回顶部