QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1714|回复: 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 u5 Y5 T7 l9 J* E6 o
    : ^' B- c' @; z7 Z* j& [3 w
    & G8 c3 Q7 d8 R$ h; X; Q" i
    /*" B) N; @. f/ X& ?( _2 o5 g7 I
    使用递归方法求全排列0 J$ m* k& Y/ j$ {' v+ w! l
    */
    ) h  L2 u5 U2 }8 d/ x
    " G" F# X* j% I$ }# ]6 ~#include<stdio.h>. @# k/ {5 o, L$ ~9 t
    % [! L* W* \3 C/ ^3 R* n9 S
    int sum=0;6 }3 [2 a+ T& v2 L: W) @+ k, m
    int main(){
    1 ]5 z  H* n- y' l        int n,i;9 G2 M3 h3 W0 s1 `
            char *p;2 E9 z! J2 Y* c
            void perm(char *,int,int);0 h" m+ m) K. a' Y( C2 v1 e" ^
    6 N* t! e: O9 l/ d; |
            scanf("%d",&n);
    , s3 d4 a& f2 g        p=new char[n];
    " E6 c8 ~7 A3 x        for(i=0;i<n;i++){0 s5 G) u/ Z2 j
                    getchar();+ ^& g) x4 a: `' r. d( E
                    scanf("%c",p+i);* J6 ^! B6 G1 G3 b5 z3 l
            }& x* ?& v8 d  |( Y/ e
    - N0 U! v6 E1 ]5 U- N7 C
            perm(p,0,n-1);
    - Q) O$ i8 ?2 A8 ?        printf("==>%d",sum);
    8 L( Q9 g' v0 u. g5 ], g1 X4 Z
    8 T" V0 K; Z0 I7 P% q        return 0;% E, ~) P; Q: b- r2 R# _
    }) n; s7 s) G% n( s) ?
    / ~1 g. ?1 m0 S8 _( }/ Q  ~9 u
    void perm(char *p,int s,int e){
    2 V1 X+ a& H9 @; P/ d        int i;
      L9 q$ Y' K; N6 x* v4 t        void swap(char*,char*);  C+ j* V9 [& D! f& l
            : @" o' @6 m+ z8 e* I
            if(s==e){+ _( e6 o0 N% ~1 L) o# m7 e
                    printf("%s\n",p);
    . L) n* V6 I+ M: U( T- I5 Y1 C                sum++;3 c5 _: n; E- v: H7 D
                    return ;
    & _8 X7 c8 s8 [& E! H        }0 y" d1 E- S" j( t; }
            else{+ r* n& y* i6 G# L5 Z1 v
                    for(i=s;i<=e;i++){
    . K) i% K" z0 j+ ]- c                        swap(p+s,p+i);
    # b2 o& W9 y# p  |4 i6 i- w6 H" W                        perm(p,s+1,e);% R; T; a8 ^! y1 U. a* R
                            swap(p+s,p+i);! u& F3 l7 p: C) v7 g, [% V
                    }1 a8 D4 i' K1 e- c
            }
    , G, T; K) n2 v) P}
    7 v) m$ L8 v/ d" e
    3 O& Q: Y) h6 D5 y2 d, |: M" ^void swap(char *a,char *b){
    4 o5 a3 j( c  B/ n* E, L        int tmp=*a;
    ; {2 z5 D: i1 w' W- O1 t( U  }        *a=*b;4 I9 w5 r( [) v& B$ a# x+ g2 f7 c8 J
            *b=tmp;
    7 M, n! c. k; ^}( f( M, [1 N) q) r9 S
    * `9 V) x1 E8 ]+ x2 S
    ======================================================================
    4 j& _2 i. M) h    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。' D( Y/ p. K2 `: W# R
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    & y# O( K4 {0 `6 J; ]" f3 T2 Q- E7 j/ f$ P( z" e/ g
    # L; y6 U" ?  l
    2 _! M3 n9 V$ H6 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-6-13 09:48 , Processed in 0.378869 second(s), 51 queries .

    回顶部