QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    7 r  X' ^0 J; G; ?

    . l9 ^) @8 J- \* o+ b2 U4 {4 ]; r
    1 Y2 U6 \# a# n/*7 k. B/ V3 Z: {& F6 D5 m
    使用递归方法求全排列8 R2 k9 t. ^, R/ H# R+ d$ |$ y8 w
    */
    6 Y* j! \& n' n2 d: }( {, R7 }# _1 ^) x- A5 E5 j2 _# ?
    #include<stdio.h>. R5 C: m( v9 X, k9 B
    ; s6 H3 l( a) p0 W3 j+ X
    int sum=0;
    : B2 O7 x: ]( z8 Y: k# p/ B0 P7 Eint main(){0 _0 p# G' Z" w$ K& h7 D
            int n,i;
    4 D5 s. P9 ^3 G4 S4 B2 O        char *p;7 t% w# e6 X: `6 a! O4 a
            void perm(char *,int,int);  c9 h+ `0 F; k  l  c: p

    + |7 U$ m/ O2 @# o        scanf("%d",&n);
    ( J9 o6 F: [3 T3 N3 p$ R        p=new char[n];
    ( ]% }/ k6 [/ j        for(i=0;i<n;i++){
    % V' F0 u, G/ a1 e5 W) k# y$ N                getchar();
    ' g, z4 F# i4 ~  J) y* p                scanf("%c",p+i);8 e+ `, u1 S. V& [+ @$ v& J2 O
            }6 E8 i, l! ^7 [# ~& m0 d

    ( ^- X; t1 w9 |- h( z; T        perm(p,0,n-1);
    / T8 g) L/ `+ w# c) ]        printf("==>%d",sum);8 t4 G$ j* a5 M' j
    , P: J: A/ S5 c( E7 r
            return 0;
    & e, l% F4 y) B2 R; G) F: H2 i}
    3 Z- E2 f' O. [/ H& D+ A7 O9 ]- |9 ]$ r! f
    void perm(char *p,int s,int e){/ [+ v5 A$ y& n3 B' f$ }
            int i;
    0 e% {% C3 b  L' L8 i+ |        void swap(char*,char*);
      c! C8 r3 [. K" _5 Y6 |# t) z        
    % o5 f4 q* Q# B3 C. |' u5 r( S        if(s==e){4 `; d3 i  I* d& Q
                    printf("%s\n",p);$ x7 p( W9 |8 f* |
                    sum++;( O" b; Q$ Y1 r5 N% P! \1 H, h
                    return ;
    " ]4 z7 ^! S7 I. u9 V: G; O: G        }! b/ p+ g% o; S- D0 D0 E
            else{* v. Y6 F* x, S9 ]0 A" Y% t
                    for(i=s;i<=e;i++){8 K6 p. m/ @7 B
                            swap(p+s,p+i);
    + C0 |  l8 v  ^6 d( K4 y, h2 \                        perm(p,s+1,e);/ v" V( a1 R# e% I: @( i
                            swap(p+s,p+i);
    ! |" z. u7 x' Z5 F5 [                }2 M9 |7 k1 j$ o  n
            }9 L2 m; n8 a! N! j. B
    }" ~) O" y! h: [  j2 v
    # e- B8 D. h  I# U
    void swap(char *a,char *b){
    7 [1 N/ J' L5 e4 E( ^        int tmp=*a;
    ' T6 z! J1 C/ t! K6 e2 M! G# `' _! E$ _        *a=*b;
    3 ]5 R( i# _8 a: y* y        *b=tmp;
    ( X% a& c+ N8 ^}& u0 A0 c  k* A4 v/ y0 }& E9 J/ w
    * ?2 H. N. x5 Z. j
    ======================================================================
    4 I0 H, s7 T9 f5 `9 k* u1 r! l    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    2 e# g! U4 S" q: x7 Z7 u    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    ) X4 H2 U# i( O; b, Q& f. F+ l  X! i# p2 p% X
    / C0 t' c7 U5 a4 e# S/ g3 Z* ~. v' W

    * G! i! T* x* U0 `
    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 23:23 , Processed in 0.307845 second(s), 51 queries .

    回顶部