QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    ' y. M( G  ^  K0 e$ X% L
    & B+ R+ i3 k; e/ J9 c1 y
    0 C; c: {& l. g9 l; h* E. }5 y* K1 R/*, N9 }" m# D3 w4 U2 {3 u
    使用递归方法求全排列
    1 [& b4 w) h# |, {1 A*/4 u) Z; G" }2 C: \! E, R. c
    . m+ b4 U% M% K4 \9 v: a4 t
    #include<stdio.h>
    ) ^; ?8 I  z- D2 {/ v! W9 s% q  w2 V  g6 @# W* a8 A9 p
    int sum=0;
    6 [# v: y. l- {  {  x5 mint main(){
    4 F8 v$ |7 ]5 G  U        int n,i;( R8 {% s5 u/ q6 f
            char *p;
    * p- P5 |  P& n; m+ E        void perm(char *,int,int);
    2 `4 \4 G3 M8 d! ?1 t) _: t" g7 y+ _# \5 `7 X
            scanf("%d",&n);. f8 H. @# i* ~/ {
            p=new char[n];
    7 H" D7 U0 L) R5 Z! j5 v        for(i=0;i<n;i++){
    0 `0 T+ a2 w6 D+ K4 P8 R                getchar();
    ! l! G& @  l1 s. K: N& J7 z                scanf("%c",p+i);
    & T0 [, `  q& A, ^        }1 w& E! w4 F$ x) A
    # k% @( A/ D  z0 E  x
            perm(p,0,n-1);
    1 E* q) M' `/ e& I) r, Z        printf("==>%d",sum);+ @& n! {, ?  Z9 s0 j% m
    ; ?/ i9 X2 @, d
            return 0;
    ' \4 S8 Y, H1 t) [}
    8 J3 K3 \" H9 m. k. B- L7 ~8 O5 d' [$ q# g0 I
    void perm(char *p,int s,int e){. S. f' F3 m( F, B. k, H  ~, k/ J0 c
            int i;$ T" K7 s$ Q! i& E
            void swap(char*,char*);* M+ R) H7 l( p) Y! |8 f
            
    # u0 M! a! o* M6 P' m7 a        if(s==e){
    ; Z+ z# {( ~2 n) m                printf("%s\n",p);
    4 h: D) I* t8 Q9 _                sum++;6 F: P( M- R) }: `  {% y! J
                    return ;  |8 o: q! a' D$ m1 F# v3 W( g
            }  g# `: c8 b$ s! }( Y6 i
            else{5 q0 \) f6 M$ V& ?7 l6 [
                    for(i=s;i<=e;i++){+ k) I7 z$ c/ L5 _* q: d3 V
                            swap(p+s,p+i);
    ! f+ w# u4 P* p. \5 h                        perm(p,s+1,e);3 _6 M8 Z0 y6 v' n
                            swap(p+s,p+i);$ L6 p, f0 G4 C4 e
                    }9 ^8 P5 D* T3 j8 C, @- j* o5 b
            }7 c- }( F; J8 L$ s2 p) D+ i9 j) r( U! i
    }. F. `) [" T5 T$ H' F
    % U; d. m0 R- p! i  K" S9 V
    void swap(char *a,char *b){% H& X6 x; W% Z& {! \% p
            int tmp=*a;$ Q/ i( h% m; A
            *a=*b;
    - N% T% J( U" j% y$ E4 U& ]8 b( |        *b=tmp;
    5 \) G! S+ d9 ?3 t) J$ P! X& a# n}
    ! I: g. K. S% D1 C, Q) y$ S, Y* n7 \, U) ]1 N: \
    ======================================================================
    0 @" F# ~; {$ o) ?7 o3 o    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    % e( ~/ s9 F6 q* E) K8 _: d" C5 l    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!5 N6 k1 T# P  q, {1 ]* s4 v) k
    * A$ }. C* {# i5 _8 z' ^" A: m
    % ^; p! r# E3 m; s
    3 v) Z, g- S* }. \& i/ N0 n
    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-31 22:11 , Processed in 0.407170 second(s), 51 queries .

    回顶部