QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    2 w. H. D& z4 @
    : C" M2 {' {$ X9 |$ F3 J7 }
    3 N3 ]" Y+ w+ W' W1 `( c/*
    & W# d/ j* |/ E. w, v$ L使用递归方法求全排列! b1 i$ b2 g  g6 ^9 U; W
    */+ i. P* X' ^4 D" J
    2 ?6 U: E+ s1 V# ~
    #include<stdio.h>/ X$ ], S/ T4 h, U# E
    ) g: ]8 M" W% C$ ~& m
    int sum=0;* ?. `; e& L! `3 A
    int main(){2 b3 \- p3 ?' \: J' e7 [, g. T2 a. o
            int n,i;8 X. M* y4 `2 O% }, m  ]# ~3 f4 h% C
            char *p;
    4 V9 j% M: `5 J* X% S' i) T1 S        void perm(char *,int,int);
    : w' w$ H0 n( H! e/ i; E
    9 T: E# p& x1 @  d) g- L, [' v+ J        scanf("%d",&n);
    ! w7 g# E# J1 D2 Z* Z. S        p=new char[n];/ v0 x( ^# M9 m4 g# i& E
            for(i=0;i<n;i++){& p8 g1 @- N3 ~; q1 M
                    getchar();, m$ Z0 n" D- h& p) X
                    scanf("%c",p+i);+ g: S$ X; D; ]# ]' m4 J- v
            }7 H* j# p  X4 m5 o  _8 K
    * B1 b/ Y7 W% f
            perm(p,0,n-1);7 W; {8 [  V3 z& B: K  Q+ W
            printf("==>%d",sum);
    2 x9 q, N. `, U5 W4 r: \
    ; X) I2 n+ ]; G& M9 E' v! ]        return 0;; R, `0 A6 S+ E, F% P, e3 m9 _! t. E, Z
    }- E; \& b  p1 ~4 O* s: Y1 b

    " X" v/ [* _( fvoid perm(char *p,int s,int e){/ q# z/ a% X4 G# V0 p" ^, `
            int i;
    ; c4 [5 l0 d  D        void swap(char*,char*);- ~3 G3 T, V, m1 A
            # \" l% W3 O+ v  O+ B9 N4 e
            if(s==e){
    ; A8 q4 L" ]3 R$ Z, e3 @8 Y                printf("%s\n",p);+ J; O% a( [  G
                    sum++;( Q. h2 H3 J  H% S
                    return ;6 p: Q# x& N* P  c: K
            }
    ' D3 v/ ^7 j: u/ V6 R9 v        else{
    5 I: E- B) g- {! b% c) L# F                for(i=s;i<=e;i++){7 K% a' w: o  ]6 W
                            swap(p+s,p+i);. @. E- G7 |4 ]! m8 L& e% @% o
                            perm(p,s+1,e);
    $ e, L/ t- h% O) B) J# c" Q& L                        swap(p+s,p+i);
    9 E" q5 l# l' @0 v                }0 V2 j3 q8 s9 S
            }. q- ]# v1 Q0 b5 U" l
    }0 X" }$ z) [, [) v" H. B% d7 t5 o+ q, C

    ( V( Q/ G; X" e# i2 Zvoid swap(char *a,char *b){
    2 m$ `1 O) |- W  B$ O. z        int tmp=*a;* r& G- T5 D  c/ C# s
            *a=*b;' e! }. A# u3 ]9 K" |/ b
            *b=tmp;( q' Q3 k, b7 R# O  y! G0 S, S, o
    }
    9 j+ t4 m# n3 u8 A7 d
    9 u: [- M: E- K6 S9 {. Z======================================================================
    8 `' X1 x* A' q9 e    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    ' K/ ?/ W  O) r9 K' }! d* V  g    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!, W. {. n. s8 K1 T# q4 c3 A

    7 |, @2 b% h* W4 y- b) z+ `& U
    ) k: n% }9 g7 ~$ d9 l: G
    ! f2 [8 \: I9 h0 B7 V& o# f- Q- A
    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-30 04:09 , Processed in 0.303512 second(s), 51 queries .

    回顶部