QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    5 i7 A* p4 O7 s8 U; \8 M0 }

    * I! b. Q! t1 Y7 H4 g8 I8 Y$ A6 P% c: y  ]- A- N0 v
    /*4 J  V+ c- e+ x
    使用递归方法求全排列
      C4 m; {3 w9 i5 m. p*/* R: G& Z7 r/ u1 h: L" T
    ' I5 {, N0 I3 g
    #include<stdio.h># v) ~) c* n& C

    1 O9 m/ }" Z  k+ A& r" hint sum=0;6 m7 m* R& V! J+ S% _: U
    int main(){
    6 f  Z! P+ z! L7 x1 b1 M        int n,i;
    ; s; x& {# Q9 t. c; q6 O        char *p;
    " ?! t+ ^. K/ y* T5 Z        void perm(char *,int,int);' s8 e4 K. Z; ^9 g* X
    ; U8 b" m4 F1 k; I& H. ]. \
            scanf("%d",&n);
    / T0 d0 {7 z) ?5 {: i: F: Z        p=new char[n];/ c* g# Q% Z8 g* @3 M$ T  F5 I% u
            for(i=0;i<n;i++){( y. o  g! G; v
                    getchar();( ~. p6 H5 h2 y4 h  y
                    scanf("%c",p+i);* F1 d! e6 v) y+ N
            }; L0 {* y3 z" f7 E

    . t$ m$ W! _' y; D+ B* U        perm(p,0,n-1);* T' ?2 [# m/ w6 M: |. o
            printf("==>%d",sum);; X9 G5 }- B; `9 p( I- w

    * ^1 ?( [* p$ d( N        return 0;- H4 I. f4 O2 m9 y/ }" ^# K0 n
    }6 K, X8 v7 G7 X0 N9 H9 f! n& E

    / _2 ?4 G- B; [9 r7 G: h. ?void perm(char *p,int s,int e){: ~6 l5 M# n" g+ D
            int i;: o; ]2 Y) B' i( v. b( H
            void swap(char*,char*);7 x  r3 h" a0 I4 g% P2 N4 D
            
    0 ^; d! o% z! C5 b0 i+ F4 y5 d        if(s==e){# d+ Q5 A# B$ P" X
                    printf("%s\n",p);$ B' M. z) X: Y: d/ w
                    sum++;; G2 V: K, c8 O; e
                    return ;
    " x+ n! G( E. Z' ^  R  V! z( }* ^( A        }# R( ]8 v, Z) t5 G4 k* F
            else{
    , M; w+ a0 A' x+ d: q& }                for(i=s;i<=e;i++){
    9 g' Q% x: \6 Q" r% k+ d9 |                        swap(p+s,p+i);
    1 y* h, V7 s" b) c! D0 m                        perm(p,s+1,e);
    ; `8 t6 M8 U" u8 G7 ?# j                        swap(p+s,p+i);
    : {6 e& S4 n. O' W' r' N                }( C/ c2 p2 C8 C4 u4 z
            }' z8 z2 s5 l8 b: |
    }
    1 A) f6 E3 ?$ C! f1 ]7 y. V6 n$ X5 h! w+ H$ z
    void swap(char *a,char *b){* W3 r  ^4 \0 R8 V) m! \6 G
            int tmp=*a;
    ! s/ b4 j2 c$ _) b        *a=*b;
    1 D& S* j8 p3 h& O+ N- v; N* N% V        *b=tmp;
    2 N% a# {2 X; T* J6 q% d}1 d) D& i- p; f" {

    7 \, [6 L8 V0 O7 e6 w" M" l9 m======================================================================
    / T2 J- W7 @: G' E1 c; c: l! Q. R3 @    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。0 G  P) p- Y) j$ z  L! n
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    2 n) y' E9 V) E: `8 F* p3 D2 V2 j* i5 W! ?6 G/ I% W

    . x3 X: m2 ?# q+ y& E0 A7 h
    * P: a2 B4 w- M2 e* G, W' u! S
    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-4-14 11:33 , Processed in 0.426062 second(s), 51 queries .

    回顶部