QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    % k+ }8 u! R! Q8 j
      y5 q+ s1 }0 P& B
    & i1 z' s; t0 j2 i' j/*
    / R1 m9 s3 }6 B: l; M4 J使用递归方法求全排列
    3 c6 a& e6 f9 s*/
    6 L. S/ F. i: r$ k! j3 E1 x/ w4 R# F0 C. n0 P# W7 r/ S* R
    #include<stdio.h>0 e$ z. ~' P2 f% q0 R& Y7 e) |8 u

    2 v3 m+ \; u% o1 ]' tint sum=0;( ^& t6 X3 Q- T9 V; \
    int main(){
    " |, q5 t* G8 F; N) V' k        int n,i;$ {4 m: k) q9 i6 x$ L" @
            char *p;
    0 o. E5 c( H; d  ~        void perm(char *,int,int);
    , X( V+ J, C. ^7 \9 E" ]( M* H
    : s' i+ h7 m( Q5 K        scanf("%d",&n);
    3 Q. V# Q+ E- ~. D* w        p=new char[n];
    8 Y6 g' ^3 r+ d, l9 B        for(i=0;i<n;i++){' ^1 w5 {2 G9 `
                    getchar();( B* n; d* F- c# _  A1 H! b' L- C5 V
                    scanf("%c",p+i);
    1 a) Z& F  I- k        }
    3 j7 z5 g# P7 b' i3 G$ ~3 M+ }8 F- u# S/ D4 |
            perm(p,0,n-1);: j# q. f2 p' n/ E( \8 I* I, `4 O
            printf("==>%d",sum);. n4 W5 R# c  p1 l3 I5 R8 |
    , V7 K  I1 O3 u# W$ \
            return 0;
    - [$ {9 P( K- P# D( P, ~9 c6 j4 i}
      w( i$ L8 y; M$ E9 Z; i: Z, _- \, a
    void perm(char *p,int s,int e){8 r0 W, y7 |' }
            int i;
    9 {7 q$ P; P4 P/ ?) p        void swap(char*,char*);! W/ [1 {+ b  c- u* t
            
    2 O! l  s6 Z$ F6 t; K        if(s==e){
    . c" U( Q3 [4 E" i1 O                printf("%s\n",p);3 b7 |6 W) s4 T
                    sum++;# j+ t: v5 I: B; n4 \! g
                    return ;! s& }7 O$ C2 K' O( q9 ]3 o: d8 J
            }. r- w7 X% @/ T8 V
            else{
    / T9 B5 _3 j2 E; H5 t4 q# T. D                for(i=s;i<=e;i++){
    7 Y; h0 r9 d, y( S5 H: _                        swap(p+s,p+i);$ R1 K$ Y* [& x! ^6 d
                            perm(p,s+1,e);
    % T5 J, |' Q  y9 }+ e: M+ [                        swap(p+s,p+i);
    6 _  h2 f# E% M3 u                }6 d* ~3 O1 N2 w0 A- v. ?: @$ Z2 g
            }
    % `0 E+ u3 X* j! ]; l) q}
      V7 S* x7 c. h$ ~% @6 D& |% |1 p( C+ X# D% m8 ~' w3 F
    void swap(char *a,char *b){
    7 z5 @; F# X$ K8 w: N+ d        int tmp=*a;- u- R; L  h3 k# S
            *a=*b;1 k: d- v5 A$ g3 c% e
            *b=tmp;
    3 s& B1 @1 h% [) `}
    ) e9 N3 C" w% ~2 [& \+ E' ^3 U$ z- n  m1 B) d9 N
    ======================================================================
    - R9 K2 j& {4 v    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    9 {; W* D, a- h2 Y6 k) j3 l    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!4 `* d( I6 a6 {3 n- w& }4 ]' W
    ; R$ o: I# F1 _: k- I9 f- Q
    3 w1 R0 H: @4 H, v6 U0 _2 C

    ( g8 y/ ^% m8 ~8 v6 A9 I
    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-14 23:48 , Processed in 0.395140 second(s), 50 queries .

    回顶部