QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

    自我介绍
    往往
    跳转到指定楼层
    1#
    发表于 2015-4-16 14:28 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    ' i! B0 i% m% ]( D$ ?$ P

    ! d) T8 @, w6 M. e' B; X& d& B
    + g3 ~  I. {# @' q, b9 V1 g/*$ f( e1 T! \& }+ r9 I3 `
    使用递归方法求全排列
      J* ~  J+ R' ^, o*/
    " F$ x. @# t3 |& x7 a4 C  C
    % z; H+ H( {, u#include<stdio.h>
    : H) c7 W" N+ i; V* }( x  |7 T$ Y. W) E) S$ u, a" h
    int sum=0;
    - S+ w: Y' l- V2 ~int main(){
    6 e* R2 k% g* ^( K4 F$ {% d+ X# S9 Y4 i        int n,i;
    " @" ~( p; `7 o* Q3 p3 t( X        char *p;" \7 K0 a# t. F9 q+ w
            void perm(char *,int,int);
    " R) {' x9 s. t+ ^& g
    : d- X" O9 v4 H' N        scanf("%d",&n);2 J% z+ l2 G$ l+ t1 S* }
            p=new char[n];. H# O) `2 n; M+ D6 J& D9 H
            for(i=0;i<n;i++){
    9 D8 A& ]2 M: g) Y                getchar();
    1 i, Q% u' Z7 f                scanf("%c",p+i);
    / y1 S( o& d2 @! p# B& j. }        }
    3 F; d# w& J3 Q) s5 I' @
    2 V8 M+ h2 f/ y4 i$ ]6 [        perm(p,0,n-1);5 z% {; I) I( P* P3 X- ~7 k
            printf("==>%d",sum);
    : d7 O6 P4 \% M6 Y/ u0 @" `1 H
    9 {9 D0 G2 n0 d& n4 p/ i0 ?        return 0;
    6 k- A% ~/ W/ {: l8 [+ y, n$ O$ B}
    & {6 U: U7 U- O" x9 i4 K5 t+ e' a# S  ]
    void perm(char *p,int s,int e){9 Y8 X9 [& s# }% |
            int i;: ^- G/ J" N, {# }' x/ x3 y+ \: k
            void swap(char*,char*);; h2 J; _) h$ k
            ; ~4 i/ V  A, m& ~: Z. D! C
            if(s==e){9 [& f. p. {5 [  h* K
                    printf("%s\n",p);
    2 ~6 f; j3 W, ]$ x8 F+ n0 c                sum++;
    , q" }4 t: c' O# n* }                return ;* s3 l) U3 K! W. V9 {: w
            }
    3 \5 p) ~. |3 ~5 A$ B0 p        else{9 g# d8 i: r$ z
                    for(i=s;i<=e;i++){
    " I6 ^3 o4 e5 }6 c9 j* \5 s' C                        swap(p+s,p+i);
    , S7 k& [; F" X7 U" M. ~                        perm(p,s+1,e);7 P. i+ A' R8 }# b. y$ ~6 \. P  S
                            swap(p+s,p+i);0 x8 ~1 Q" W; H: u/ c# M' {& t, a3 P' I, m
                    }
    - d% o7 p# |4 u% }$ z% G        }
    2 d+ b9 k# u5 P5 n; r6 M# o, q7 R}
    9 Z- G+ s( ~+ X) f# u( S; u% N' ?# r. {
    void swap(char *a,char *b){- W# ]5 a& I  V( _' r9 f: X
            int tmp=*a;
    : v' Q3 ]- d8 B/ f2 w7 [        *a=*b;
    + C9 a4 ^  P* i, P        *b=tmp;/ t: E; n+ q6 v  x
    }2 }% W# f/ P: Q

    % l' ^( `, ^: [5 A4 a======================================================================
    . U+ e$ S, \7 i    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    4 f$ b5 @* D" }7 ^3 d; Z5 e% r: P: {    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!  s6 U( s- `. {7 k
    . X) P+ u' X9 |
    4 X' J3 Y$ e5 I) E5 L

    - b1 v+ [+ x  ~2 P0 z6 b, k
    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-16 08:52 , Processed in 0.416543 second(s), 51 queries .

    回顶部