QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1761|回复: 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 [& [  X: E) ^

    ; ~2 z/ u6 n6 e  u7 H. j+ ^) k% N& C( S# U+ \
    /*0 A' M, {# n9 ?4 X. @0 m" X2 n8 z
    使用递归方法求全排列
    / }& J' w! b0 L& L*/6 C! I8 d8 M5 J4 G

    8 `( T: a2 E3 n/ `#include<stdio.h>! V; k" n% ]6 S$ N! r$ p6 F, K
    : o7 G% n7 m' e8 A" [+ k+ k
    int sum=0;
    1 P: a' R2 Q  S0 x4 \int main(){7 B" L8 \4 b9 I+ s
            int n,i;
    * `" ~- M, t4 j& {        char *p;
    - y9 q8 E1 q1 r' a7 P        void perm(char *,int,int);  @! I5 p! D  S2 k$ X; G! T
    9 Q: I2 O3 S. L. |- R% q3 O
            scanf("%d",&n);
    0 m9 A. v4 _3 \' C        p=new char[n];
    ) e0 ]" b/ b  D# W) a( o        for(i=0;i<n;i++){& `1 o  S+ a6 n1 A/ L- K9 G8 Z' g
                    getchar();
    1 m! W! M; A* z/ o5 m% W0 ~; c                scanf("%c",p+i);
    . }4 B! S! s2 U1 R        }. b4 I* A) n/ Z& S  Q

    8 O% x4 E* D; h. s# e9 z+ Q: I1 j        perm(p,0,n-1);" A: `; h; O/ P
            printf("==>%d",sum);
    % p5 K3 ~+ g$ a- ?) G$ N
    ' R% _, X7 ?: w( _; j  ~# n6 ?        return 0;& Y( K$ i! h3 l2 B& t3 a0 j
    }& p/ e+ M& \# C' ^
    * ~% j* b% n  P8 \3 O3 I4 F8 }# w
    void perm(char *p,int s,int e){
    9 Y8 U- u2 b; r" g  y        int i;
    ! ]5 T( |9 r' ?        void swap(char*,char*);
    1 ^& n; s) J5 z/ o        
    7 J- o* P; d% h8 K        if(s==e){- u. J: |% e2 l6 O. H
                    printf("%s\n",p);
    + x; L0 M  L% |; _! t. ]* M" w                sum++;! o+ w! l; t7 \, E3 i4 o7 \0 A$ w& ]
                    return ;
    , ^, e3 C1 D9 ~! }5 L) S        }
    2 u/ z6 ^8 J, w2 Q6 g7 \, }! C        else{* h+ q2 }5 B0 `/ U6 q
                    for(i=s;i<=e;i++){
    7 U2 O8 O* {( [/ l5 U4 F3 v                        swap(p+s,p+i);
    4 u) [0 e( S+ h3 g                        perm(p,s+1,e);
    3 V- N" W' j. I8 t                        swap(p+s,p+i);
    6 d! Q4 g0 ^% g                }
    ! N) }. N/ K$ G        }
    % M2 x) K- L$ [# p}) [) q' w- k! a0 c+ O
    ( M2 e- Z! }, Y0 q3 s
    void swap(char *a,char *b){
    + ]+ y" _/ {6 f        int tmp=*a;3 A+ O3 n" t' o% O" W
            *a=*b;
    5 y* N+ ~6 o& D6 Q5 l0 R) @. C        *b=tmp;1 V' m; q5 W2 e- v: s; R
    }
    0 t2 }, g* s' P
    ( A& d) {  P. `& O1 e  _======================================================================
    ( a1 Q7 {& N& }% `) w    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。% z1 Q4 o& A  J5 G0 o
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    1 Q7 l) G. V4 ]2 l, W  m  _6 V+ ?% B5 |0 L7 k9 v: `

    - l$ `& h# H4 A1 F* e
    : L, W6 l/ R$ m; G* b, B! J
    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-9-1 01:25 , Processed in 0.350412 second(s), 51 queries .

    回顶部