QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    / m( s& @; x: z

    " a/ R- q0 M( C4 D5 T3 z0 a' W2 I9 s* `' Z2 U+ Y
    /*
    + ^7 b) @% v" {5 ]' P0 Q1 N9 r使用递归方法求全排列8 k  _7 D1 s- E, t! z( A8 W2 O& U
    */
    * ~' }7 w+ E  Y9 y
    & q  D. ~/ j' Q; s2 _- u4 r' E#include<stdio.h># c. j/ `( D( T: x) n: U
    " v* l/ o% H. C* E
    int sum=0;
    ; W$ W" }3 L& W. Cint main(){3 n# x* O% o" ]* O/ P  t
            int n,i;4 u2 J, |9 o8 A( d: ~' P  Z1 Q
            char *p;
    ' ?  Y+ \# Y( T" x3 Y0 v' W9 I        void perm(char *,int,int);' M! X/ W+ ~* _. _5 ?9 I  @4 K9 n/ R2 {

    6 ~3 ?1 J' w. x        scanf("%d",&n);
    , p0 U: w8 `: X2 K$ F4 x- M        p=new char[n];
    7 z3 }( S6 |0 B        for(i=0;i<n;i++){$ J7 w' @1 V5 b. C* C* T
                    getchar();  a) t7 J# {; d7 |1 f2 }" W# R
                    scanf("%c",p+i);7 ^( N" T: K! x% Z
            }7 V( N+ n. Z( [, x0 w/ t  p0 ^5 {  M

    9 u! [( E: Y8 f2 |, h4 l7 J2 p        perm(p,0,n-1);( P4 I$ |. T) Q& Z
            printf("==>%d",sum);
    : n+ m: Q, m1 C& F# x, q0 d
    9 F2 O2 B& F) b# \0 L        return 0;% q0 B* Q$ B+ T! N# |/ I! Q
    }
    - x' `* S- Z9 D2 G4 T% z) y" b  N% R$ _. i! A  K
    void perm(char *p,int s,int e){
    ; L% i. e  }: ?2 S! h0 O/ F: L        int i;
    & j; d! B& p$ D% J3 a: C+ {  x; U' |        void swap(char*,char*);# u3 h* K" Y4 [' [- V: {8 E
            " j: h% @; K; w7 @1 d, L
            if(s==e){, s1 r5 a  W/ O  ]
                    printf("%s\n",p);/ j- N9 g  a9 A- B$ l7 O
                    sum++;5 }8 s! E5 t" s- B: n
                    return ;
    + X5 K% Z+ Z0 k        }
    % v- a2 W/ M' t' }% _        else{
    ' ]' \) }. F% L2 ]* a: o) v. r                for(i=s;i<=e;i++){
    5 D8 ~: U! F8 F4 _7 i( @                        swap(p+s,p+i);: s$ G: t& T2 y
                            perm(p,s+1,e);
    2 |; N1 p5 u5 |1 w0 h                        swap(p+s,p+i);
    3 \7 c2 m0 \( u7 o- ^: u                }
    2 P( u0 `$ O* s# ]9 ^        }
    / s, J# m. q; p! f/ \* M, n}
    ' G* h  d& ?: R5 T# f) N; I5 s: l. q) I# f+ }
    void swap(char *a,char *b){
    7 F8 Y" n3 [* v  Q9 m% Y/ p        int tmp=*a;" Y: p" s' G  h8 s' J" w
            *a=*b;
    ! K" n3 B" Z) A        *b=tmp;  {  E4 s' ]- \  b- `
    }9 r- i3 i1 ?$ x9 K' e4 i# b

    2 J5 Y. w9 P+ x& @6 V2 Z" D======================================================================1 V. x; a  P- ^3 W; h0 P
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。) c9 x' C# O7 W6 i  ]
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    $ k4 ~1 ~; w' C0 K
    5 e1 S  m, ?$ X( Y1 U- g
    ) S3 x3 v4 u5 C4 R# ?
    & C+ O. O9 I. u# {1 o, f2 u
    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-7-13 22:18 , Processed in 0.357028 second(s), 51 queries .

    回顶部