QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    8 M9 |. ^' f2 b+ D
    6 r  d6 M' V' [# P/ `" M
    8 I* c& B7 x0 F6 J2 y" A/*
      z, o, C/ `9 i$ h# O* A3 V( Z使用递归方法求全排列
    " |6 @$ P* ^: O2 z% z- W+ B, }*// Z5 s' d2 T2 V; U. c
    ( @; j, e" R  v4 W3 n, D+ L1 d
    #include<stdio.h>
    . N9 c$ C( Q" P& ?" o" j% c5 B( s: b0 p" `: R
    int sum=0;
    , C4 Q; X4 W4 sint main(){3 p6 A$ ~) l" S9 Y# ?
            int n,i;
    - D! ~' y4 b% i3 L        char *p;# f' e) N6 H* R! O  o
            void perm(char *,int,int);
    1 U* q4 V6 D7 S6 {# t- c) |" x1 j0 Y6 d1 g  G8 Z
            scanf("%d",&n);
    ) \" B7 ?6 W8 v3 T" e  m+ ^4 i4 |        p=new char[n];
    7 p7 [( B  j9 {0 r8 w        for(i=0;i<n;i++){5 S1 n( G0 j4 x: @
                    getchar();: f! y3 e/ m. O6 P# c7 V
                    scanf("%c",p+i);
    ; t+ @2 e! m( X# ^; H( F9 o: D        }
    : B% N; d0 x4 S. C9 I9 X
    ; Z6 C& I8 ?7 h        perm(p,0,n-1);
      K; H5 ~# u" {$ d' G6 ?4 m) K: l        printf("==>%d",sum);' V" c1 f9 U% K$ p6 j( N/ p/ v
    8 |( T4 e9 R( I( ^2 p' d0 h
            return 0;& b2 D2 B! E$ f" ]2 \
    }  v% a# ~7 n% J: G/ O

    5 S* m) d, w2 s8 e5 `& S+ a4 |void perm(char *p,int s,int e){
    ; D: _1 Z$ Q2 t! ]' [        int i;
    ' }# a5 |( V7 E* h5 I0 O$ g, P        void swap(char*,char*);
    4 x+ L6 i' ?: a( Z( f) p* E8 b        
    2 S4 [8 l# p! n: d! s  H        if(s==e){1 r( K# V& s2 L5 G
                    printf("%s\n",p);
    / o/ _" X% w0 o; S                sum++;+ S+ g: Q! |0 B& H3 m/ }2 k
                    return ;
    0 l8 j5 z8 a. n1 ~        }
    . h( _0 K" X" l" x* c        else{
    4 `% p+ p7 k6 i) h! N                for(i=s;i<=e;i++){
    0 }! u* c. }9 j9 G" `0 b, M: y( h                        swap(p+s,p+i);
    0 [0 |2 O) \3 N, w7 U0 L8 Z) i                        perm(p,s+1,e);
    ! N7 [4 l) J. K0 t1 s, e* d                        swap(p+s,p+i);3 P- i9 u2 ?6 s% B9 W
                    }# b9 H1 v0 J3 x; S1 N5 g8 E
            }
      ^4 k1 W6 f" {% H}8 U( X$ }. }4 _

    & J, D6 F+ C( o$ `# d, evoid swap(char *a,char *b){
    $ A/ t+ n( v% S9 l        int tmp=*a;
    : w# x  x9 q+ j0 Q        *a=*b;
    0 g) P/ b" q1 F* w: ?        *b=tmp;- J5 W, ?7 H4 M0 J& e. j) E2 {) `
    }) G4 D6 C3 U2 Z
    4 U! \' R7 `) |3 A+ n& R
    ======================================================================0 N# y8 V' T9 h0 p3 y
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。: O% G/ o' ^) }0 u$ B
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
      Y( m& r. C+ z  @1 X+ l8 c4 J. }1 I! @2 T4 |

    + A' D8 a: \6 ]. Y+ N! ?6 s$ v' |9 t9 o/ _" t  U5 S+ n4 U1 e2 L/ n
    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 17:16 , Processed in 0.416657 second(s), 51 queries .

    回顶部