QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    3 ~% V+ d/ L! e- p/ s* e
    / E" o6 `; Y/ G( a
    ! O7 F  c$ O: z4 O" q' B) S4 \/*' h0 G% {% S. Y" V/ I$ E, u0 L
    使用递归方法求全排列1 i. s9 ^/ N/ N( \+ |
    */2 [% H7 z( M8 ^* {( P: d! i9 ]

    3 f  q; t7 u# \#include<stdio.h>' S+ o0 q1 H; Q+ Y

    % e9 s0 Z! I  c9 R5 Zint sum=0;
    / W9 ~1 I9 ]; mint main(){
    8 w* _4 Y. q6 `; J' b& X, |: `        int n,i;* f; F; G! {5 O4 p
            char *p;) ^* R! R/ }$ b% Z: o+ o
            void perm(char *,int,int);
    : D+ L9 V2 c! _" }  W; s/ ^7 c3 @1 v' Z0 R$ m1 c% m3 _) N& V
            scanf("%d",&n);( j% R) [: Q, z  A. X% B+ p
            p=new char[n];7 Y* ~- S) Z  t- o( @$ c  j
            for(i=0;i<n;i++){
      R, @! v7 `/ a2 s9 j' @* A0 e                getchar();
    1 C7 ~8 K/ |8 z6 F6 X- g: c                scanf("%c",p+i);
    ' {7 Z: a! H8 u! g% q: \  s        }, `% [3 [. `) Y' T

    ( P2 a3 s3 c/ c. ^        perm(p,0,n-1);$ m0 b/ M: f& J6 A2 L
            printf("==>%d",sum);
    ; ?; j6 G7 P& m+ b8 q! |' H4 _! I: W* o' {
            return 0;' e4 s& [, w( Y* T; T
    }  g1 b+ r7 Q7 D* @7 n
    2 X4 o  U1 W) h# d0 _. t
    void perm(char *p,int s,int e){
    4 ~/ @6 b- K- J, u& K        int i;$ x7 M1 [) Q0 B+ @5 d
            void swap(char*,char*);
    9 p. t7 g7 A$ o* v& G3 b" o        # k1 ~9 Q7 s% R- z" [9 j- X9 ^2 n
            if(s==e){) s7 E5 ~  V+ Q  J; Y7 B
                    printf("%s\n",p);
    , m. B: y% _0 M# m0 k/ r0 Q( z2 C                sum++;
    4 e6 u. @4 p7 B. p& ]( |5 G9 F                return ;
    8 m- E, R2 j+ C5 T' j        }+ V0 x- \9 z  H8 k' }# E8 A
            else{
    2 D" F7 b9 H, U+ f4 N: S2 y4 u                for(i=s;i<=e;i++){
    1 }& v, c7 Y; {" C                        swap(p+s,p+i);
    " z1 P$ _9 v$ u* M( O, K                        perm(p,s+1,e);
    : y$ |6 F' P# H; P* b# y1 g                        swap(p+s,p+i);
    / k* U- O6 z: Y" j" A0 b$ `                }' A' o9 f' g4 O2 A
            }
    8 {$ Z. y: o( A5 p2 Y}
    9 J; j% ?2 J2 \
    % V" v3 a! ~/ Z6 N! Q( m" Ivoid swap(char *a,char *b){* J' C$ i- L' |' R& J3 z' b4 S
            int tmp=*a;$ a; m( D; m6 {+ G
            *a=*b;9 A# |: U: p: y8 }  S* W8 I
            *b=tmp;
    ' H) f/ K7 }! s( g$ P}4 V0 x: k( w/ x- t0 i* u  Z6 l7 e

    2 `2 U# Y' O! j' n9 X  R6 p; R  Z======================================================================$ H, k$ S  G3 K5 Y
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    % q; T7 l9 P6 e    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!8 K3 r7 q  ]5 o9 R

    , l2 V# E$ Q! h/ W: A( {( Z/ C
    8 Q# l7 M6 g& A) _+ ]( `7 h! B: ]
    ; J. E) n2 |' |% K% {) `. D# M0 g
    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 17:16 , Processed in 0.682937 second(s), 51 queries .

    回顶部