QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    + R+ v* u& `0 c
    8 ]! R( C% o" Z/ F6 L/ {/ Z; V# ^% E! I/ f+ m0 g; I
    /*+ H+ Q; ?1 Y' n3 t1 V
    使用递归方法求全排列
    ' D% y3 D6 Y6 k; f) _: ^  i# T*/
    ( V) C* ~  K" B
    2 m# A* z* U) S/ @* O( s#include<stdio.h>0 R: g3 v: E; J) ^6 [
      J: z8 z/ s9 n% g) P$ \
    int sum=0;
    2 F3 H8 b  s6 Tint main(){
    3 {- b. t) K7 b        int n,i;
    ' e& t6 c1 t2 R) y% G! G        char *p;  W6 d/ Q+ I3 j  S+ N7 D
            void perm(char *,int,int);
    7 P3 x  T5 G2 ]0 k2 j
    2 o' S8 G/ W7 a$ A" }; x. O2 B        scanf("%d",&n);
      s* B) T: u. M# D: U( E. `! f        p=new char[n];
    * h: x2 `6 X; ~' [- w        for(i=0;i<n;i++){& ?7 A( Z: l; B: ?2 u3 }
                    getchar();
    * ]% O, a9 a- X+ {                scanf("%c",p+i);
    / t% t: }: L; r$ p        }
    & h- a, ]9 _" \, b  x+ a8 {: F0 r( u; O
            perm(p,0,n-1);
    : H; v) Z1 C. K% h        printf("==>%d",sum);. {( ~/ K  p& K/ i% Y* Z( _
    # \* G, D1 E: E6 z3 C: c( u0 j
            return 0;: B, u9 x; u( x3 @
    }; `+ w/ c6 H2 M' M4 o3 `
    7 \" S3 c3 b9 V9 U# f2 m3 M
    void perm(char *p,int s,int e){! ?) f' J4 u# S7 e8 V. T! ~
            int i;
    1 A7 w; q  A4 E        void swap(char*,char*);
    1 e7 M, P! Y" e- j- W( y* I/ L0 m        . w$ g3 B, ~$ l* s
            if(s==e){
    - I# z' B& S' a2 g8 \                printf("%s\n",p);' {9 A+ F0 o, b: p: x
                    sum++;: c* g% w* G. D$ e! m7 H6 k
                    return ;4 H3 V8 n) q' x
            }/ U; ~; q, b0 I6 q1 F; o
            else{
    ' ^! |% n1 Z9 Q& J                for(i=s;i<=e;i++){
    / s7 F3 q$ e: q3 y* z4 T                        swap(p+s,p+i);
    # u% ~+ W% q. z1 p8 M                        perm(p,s+1,e);0 X' B6 u; Z' F! n0 N7 {) l; x
                            swap(p+s,p+i);0 k/ x% U: b- o9 h! H& I
                    }
    % f7 j/ ?) b, a  ~+ C% C( r        }* N3 v! D' D% Q) l+ Z2 G6 W
    }4 T: ~; G& t. t1 b

    9 j- C4 t+ j& z: @void swap(char *a,char *b){& g5 S8 W! q" f$ }7 q) v
            int tmp=*a;" t7 r' c; v, f8 R0 H: v
            *a=*b;
    4 G# d9 `" z/ }" q: E) D% P        *b=tmp;- c: P: a7 x% s0 o' K% C* N
    }
    ) g& k: k9 v7 o" q* ]
    . j/ E/ h  [, @0 h( f) |& ^======================================================================
    6 U7 M7 J$ d- d# w6 R+ _0 [3 C" D    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。) o" a. P7 e* X2 C, E2 c1 |
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    $ i/ q$ G4 P) s9 w. ?- S
    ( ^( K$ ~" c9 M6 L
    ; Q  _* j* p1 L, G0 K) g
    4 f( C: R* D% L) }4 R" E
    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-14 04:19 , Processed in 0.377483 second(s), 51 queries .

    回顶部