QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    & f8 X$ N* M6 K) x/ q3 s
    8 s2 J: ]) Z! V/ ?+ k

    . B. Z' {4 M2 y  W/*: r0 r$ p8 Y( j8 q
    使用递归方法求全排列! @6 L3 o) s" T" @* A9 i
    */
    . s0 G' |0 u0 K% J" O' ~
    7 E0 ^$ X9 i/ y6 Z1 P/ K1 ~#include<stdio.h>; D4 y6 j  T$ ~
    % K1 R. J1 k# B! g8 x7 U- m
    int sum=0;2 M  J/ \; w" Z
    int main(){
    ( g+ h+ W% y) T; A! `2 h; S        int n,i;. v9 s8 L3 C4 g& Z0 H6 ~( A+ R- B
            char *p;
    ; A  {* J+ p7 G  @        void perm(char *,int,int);
    9 ]* k5 n0 C. Q8 _
    9 u: |; ?9 C7 R0 O7 T1 d1 G; }        scanf("%d",&n);& u1 m9 y: X6 N: O+ B3 a
            p=new char[n];
    8 u7 V5 \0 g* p* z1 j; Z        for(i=0;i<n;i++){
    7 _8 ~4 j+ ]0 p3 p( g1 K* f7 Z1 X2 v                getchar();5 u/ |7 I( h" D
                    scanf("%c",p+i);
    / w8 N( H( e1 E7 l% k: {        }
    5 m- }( k2 h' o3 F: T
    . Q. g, j! [) N        perm(p,0,n-1);  B, M1 u) m4 ^# i! m! Y
            printf("==>%d",sum);: v% ^8 T( f/ b6 o' d4 T+ O
    0 J' W( z% |. f' Z0 J
            return 0;& D8 c7 q3 ~( T6 b. u1 G4 z  ~! G5 ]; Z
    }
    ( V5 m- M/ E8 X1 j. c6 c, p* b& C# i9 F# g1 Y" S" }* x
    void perm(char *p,int s,int e){
    ! k4 Y$ \" M+ ^$ k        int i;
    ! F; u  [9 w! ]        void swap(char*,char*);1 o4 i) V* I+ C" }, N5 N2 |! t) X& b
            - `* F: k. N- b2 J
            if(s==e){* x7 _1 L$ h# v& {* c. |, ?
                    printf("%s\n",p);6 _0 A) n$ i/ X! o0 Q
                    sum++;* m1 b, V, P8 `* s+ Y! n" [
                    return ;
    6 J0 F7 u4 _+ w        }* G* n% D: y3 n" r  s8 R" l
            else{
    ; W5 B/ Q3 g1 A& |' J                for(i=s;i<=e;i++){3 Z0 [! T* h$ K4 K- s  U
                            swap(p+s,p+i);
    ' q) r" O) I( H6 |! K                        perm(p,s+1,e);; t/ o  C- k; d" Y+ m
                            swap(p+s,p+i);! L7 B/ ~* _# U
                    }
    4 n7 m6 A2 v* v; I/ B) ]( n$ _  b7 X! T        }
    1 c% L! R8 B( J, ^4 S}# v7 U  E0 @, l0 f1 a& D8 d2 g
    6 X* g, z7 \9 m8 R3 O6 G% @; M
    void swap(char *a,char *b){' ]2 Q; v( l* T5 \7 [
            int tmp=*a;& n! w, F; F5 S7 @* A1 `
            *a=*b;
    / V1 B" x# U# J$ f. Z+ x+ G        *b=tmp;
    ( I% x+ q) z! f- l$ J1 ?) e- ]/ U}
    - s7 c+ @( i- `, Y4 O5 w! ~3 Z$ A. B! S
    ======================================================================
    ' r- E0 @# T$ D/ X* T4 H* I    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    9 t# a6 s* i. Y+ t/ Q    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!  T! ^$ N7 Y9 I0 x9 \1 c8 T
    - c  O# E) g5 b4 G( y
    5 W% j! J) e2 O, ?; q) z

    : T. D+ r- Q2 G4 `- B/ F
    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-4-10 21:59 , Processed in 0.298027 second(s), 51 queries .

    回顶部