QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    " o: ?' @0 t. z  |
    # ?8 |  L4 a7 ]) l: h
    # z# V) ~7 X+ ^6 P( r* P& L: u4 e3 o
    /*
    & s$ o" X5 Q/ T. [4 [. |/ M& Q使用递归方法求全排列
    ( H* [3 i: J9 M* N6 a( Y; M; h*/' m  F0 A, p9 d% q6 P! o* |
    * \1 a( c& A9 @$ W9 i. v; O
    #include<stdio.h>1 V; t2 K" w- A/ n/ |7 ^

    , ?6 g0 N% t2 h, R$ Z1 r1 ~int sum=0;
    5 y, U* _+ b8 W' y2 e6 jint main(){
    6 ~& C4 v! J3 U        int n,i;
    0 L8 x% T- V6 J/ X        char *p;
    6 ^  l( A2 A6 m        void perm(char *,int,int);
    5 s+ u7 E# }5 E6 L  w; f* D+ a4 x' Z* o6 `! u+ i* H
            scanf("%d",&n);
    ( {, D6 {' n4 u9 m( i2 p5 J; f        p=new char[n];3 {/ `9 N' N2 [/ ]
            for(i=0;i<n;i++){- y- h9 h; e5 v
                    getchar();: a& z% a! S8 @
                    scanf("%c",p+i);5 m" M% U: m9 t! Y0 I
            }9 s" A) y9 j& B# l: O) H1 m0 q5 R
    # v% K, s& q4 |6 b' k
            perm(p,0,n-1);
    $ `. Q/ Q, K3 L( }        printf("==>%d",sum);
    * ^. K/ t6 x/ M/ w3 Y4 a" G0 A% O) b3 F7 H/ B
            return 0;
    " J5 X( k0 n3 @$ @* c( k) |}9 i/ |( s! \' [+ O/ d' g4 \/ n
    " \) l* F# R; V
    void perm(char *p,int s,int e){
    / T1 M9 \4 D- o' H' O        int i;
    * X% f4 T- h% [! k        void swap(char*,char*);4 Q+ _2 L1 v# O7 j  M
            - r9 F# l1 {( R, ]
            if(s==e){0 G0 L5 A# j% p; Z, r8 v
                    printf("%s\n",p);2 d8 \6 ]+ v+ }% y7 p* X
                    sum++;
    ! Q" B( w) X* y$ }                return ;5 f& T6 D: J. _$ [6 I
            }
    2 e: _$ X, d$ V+ c. I3 h        else{
    ) ~" u) A5 F3 L/ u3 l                for(i=s;i<=e;i++){
    9 W# h; \( L2 U# G                        swap(p+s,p+i);
    3 Q/ V, t, k& Q                        perm(p,s+1,e);
    / M% F8 }7 M" m6 j9 C. j3 G4 E                        swap(p+s,p+i);1 W+ h8 ?0 Q1 X: z! @8 ^
                    }
    5 |. L! ?( p" a        }
    - D7 m: @3 O$ y' V}  ~  ?0 ~: F; ^- U

    ) n$ m. T" R. P6 z+ Fvoid swap(char *a,char *b){
    ) r$ B' U4 S/ j, L        int tmp=*a;( T% S( `, ~, S6 X, M
            *a=*b;+ Y: \. u. M9 J
            *b=tmp;
    + j/ Q( |7 g- t& p}
    ; D5 \- w2 k+ l9 G
    + z' f4 P1 N& O& [======================================================================) Y" p% Q. j' y
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    ' o1 T' |* m' J2 V. X    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!: Y  L9 V! b2 {8 c$ _

    $ D6 T1 Z6 p1 Y# s, }" M. u: b# g% S& p' ]1 k

    . y" m* m8 g2 n( J, r2 _- m
    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, 2025-8-18 19:29 , Processed in 0.295438 second(s), 51 queries .

    回顶部