QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    1 c' M0 s6 K" X' r0 Q5 t2 }

    + N1 ?1 B+ k* c. I# v
    : {9 h  u' K% R9 \; i/*
    . U9 D; P! O# W  R) [* O* F% r/ m使用递归方法求全排列0 Q; s, o/ S9 T+ Z& L
    */: Y6 B! s# u1 M! @5 B& c0 w; p
    ! W! u% |3 C1 y! T/ M# p
    #include<stdio.h>& q, d, E# a8 o
    7 j) ?) r9 Q7 Y' ^& ]7 V
    int sum=0;  }7 @, |$ L: ^, z, W. X
    int main(){- |( ]; w% D4 _
            int n,i;
    8 i, m. U+ b6 |5 T$ r# O3 W8 u* W4 ]        char *p;- x, J0 Y2 ^& [- E0 K" r0 P
            void perm(char *,int,int);2 q' y( D* _5 v8 v% n; c* d
    : [0 m. f8 C: n! n& m
            scanf("%d",&n);  C$ x. S9 V' x, ~$ e+ T* f
            p=new char[n];# l* F" h- y, s! _/ a
            for(i=0;i<n;i++){* P& ]( |1 M: L; u8 p
                    getchar();( n) Z( q9 |# \' ?0 Y/ f; c
                    scanf("%c",p+i);
    8 G9 Y7 R: {- O/ x- N        }: P8 p0 N# M2 k, A

    + A3 i) n! [; J: a3 I+ Q        perm(p,0,n-1);0 y# @2 S+ R; O
            printf("==>%d",sum);% \+ D6 ?( W1 V, I9 E9 w0 v

      m$ T" q2 I0 N( s( @3 Z        return 0;0 x1 t/ v9 L: N
    }2 ?! J% _. O9 d; O) I: a

    6 M& t# ~  F# x* g: y1 J9 Avoid perm(char *p,int s,int e){
    ) U' M. D+ [/ Y6 a7 K, s4 ~        int i;8 X. @& t; D% |  b0 h
            void swap(char*,char*);
    * D( v/ t% X$ c2 ]% |8 c: w        . Z) Y1 Z, z& l- @' g$ G+ e
            if(s==e){/ D+ `( u" N& s
                    printf("%s\n",p);* @9 }; \$ V! {
                    sum++;/ [& H5 ?1 W4 w  M4 m* k+ y. l
                    return ;# E0 D; d0 x  y9 _9 @
            }
    0 p0 y/ t0 D# S% T2 {1 r; {8 B        else{
    : ~) {$ l( a0 u0 m* J* s                for(i=s;i<=e;i++){
    6 [+ v+ s/ R0 e+ L# @1 O                        swap(p+s,p+i);
    ' `$ n1 ~/ s: _  e6 M* f                        perm(p,s+1,e);/ H; |% @. T8 Y
                            swap(p+s,p+i);+ ?0 `4 o$ h  ^+ l
                    }
    2 c/ b) ^5 u  [* E7 m        }4 K: [1 a5 p. a) l$ q, p
    }) Q  y6 E, `2 C5 [6 @
    , V) [; R' }/ X8 P& @# d
    void swap(char *a,char *b){
    2 p* z" v. |, u  j! z: s        int tmp=*a;
    # j0 F* t4 U8 H5 C: w        *a=*b;: Z) Q7 S- R5 V! O; i
            *b=tmp;
    " S' ?3 A* {8 l3 B8 Z0 F}
    " J3 i: `1 k, y% r" Q& P
    6 n# V3 I% l8 I3 g======================================================================
    . R4 v. L5 k( R* j6 G+ T    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。) D0 ^9 I' q& W9 f  ^2 l! c
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!7 R5 E4 x+ y# Y$ R& j

    2 I: S7 e1 C4 ~
    9 h! R% t: i# s6 h* b- ^1 k/ \7 o
    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 18:45 , Processed in 0.794898 second(s), 51 queries .

    回顶部