QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    # L  D) G$ N9 W2 w' A1 a
    $ o' F& Q3 ^9 c; ~9 X
    - ^  h" e6 g& ^" W/*7 K: n; o1 t# z: _) b, B/ K1 M6 f
    使用递归方法求全排列; \$ w# a& S2 ^
    */# Z: v6 h! G: ]7 D) K( U9 V
    5 p3 F1 |$ I  y
    #include<stdio.h>
    6 O( Z$ G  F1 v1 N. k6 L5 j' [, H1 t2 ]; [; f( S2 ~
    int sum=0;1 p% Z7 t3 a0 M$ L: q+ D" V
    int main(){
    & c0 K& n1 Q7 m) a4 n! |4 e        int n,i;
    $ l# I5 l' O/ w        char *p;* b5 r# T3 @9 _4 M. A- s
            void perm(char *,int,int);  l* u0 M8 ?9 F6 S

    & j% `5 N2 a( i2 \) r        scanf("%d",&n);
    3 }% K( b0 y6 b2 }        p=new char[n];
    5 i0 X3 R( t1 {' x  P6 k3 {        for(i=0;i<n;i++){7 `6 t/ s, ^2 L* {1 O
                    getchar();( x% M" c2 m8 Y* ]( L
                    scanf("%c",p+i);
    - z! Q; {% G& R4 w        }
    & J  ?  E: }0 n# ^3 \: l% E9 n, U) M4 k$ ^. \
            perm(p,0,n-1);+ I. q5 \+ b6 D
            printf("==>%d",sum);8 C* j2 B2 j* ^1 P" u! V5 U
    ; l1 D- @/ q' v; p4 F+ T
            return 0;0 z9 w, N! E( s, O; E
    }! P" b, c) f! F, \- B0 ~9 E
    - P! G- a7 U" L5 y- i
    void perm(char *p,int s,int e){
    " C2 T; h) K' d        int i;6 x- N& V5 X! v7 h) e* h; g
            void swap(char*,char*);8 W+ V* A; d1 x, c7 J- N" ^5 X2 Q+ K1 Z
            $ K4 P, f7 P& ~  k3 n- w
            if(s==e){- j' X; ^/ B1 I% B
                    printf("%s\n",p);
    ' Q" R  m3 `) t' t/ ?                sum++;7 Y, P' y/ c! f- U4 C( ]
                    return ;
    ; Q& A( T0 h- h0 M9 m        }
    " x) e% T# s$ I( H% e4 O  k        else{+ o, d* D# J9 r
                    for(i=s;i<=e;i++){0 ^' r( h" s. A& A8 X
                            swap(p+s,p+i);. n8 a" A, R7 z# n3 g
                            perm(p,s+1,e);
    0 c; b+ X: S4 R/ G, T  _0 B                        swap(p+s,p+i);
    ) H6 ~3 Y" a% R/ J, U$ F                }& E& C% Y0 d, r5 G1 H- d
            }
    1 q1 [! ~+ W3 f6 F}6 V% y3 b. ]1 o1 F! Z

    * r8 b' t" r# G' L' Ivoid swap(char *a,char *b){0 O7 j5 t- r) S- O0 z3 ]  ?. S
            int tmp=*a;
    & @2 N; Q# I6 w( Y( a        *a=*b;
    " B/ H) C5 A" t3 M        *b=tmp;  n0 b% w% c" s0 U) [
    }
    + [3 u7 v% r- |( |2 T* a" ~' V: x; x1 A
    ======================================================================- j  f5 x! x; E4 s
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    2 j6 T: Q0 _9 z0 }6 y5 j    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!; z- f+ z: Z: S) u
    ' M+ C# J. ]( j' ?( M

    2 l- J! k# J  M" `
    / F# \! W% K) A) b5 g. e1 y& W
    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-31 02:20 , Processed in 0.551088 second(s), 51 queries .

    回顶部