QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    & D) s7 ?$ k9 z3 E, v3 n2 K
    % s) {4 |# }8 G  e& A7 E/ D9 w* x' @/ j2 O
    /*2 ?( i; F1 r" Y) [/ D, s2 }& g
    使用递归方法求全排列. r9 ]2 i. M# }8 w1 ]* Q9 Z
    */! v' v9 G( z+ d  e

    ' k  [* |9 I9 M+ j* n#include<stdio.h>9 [8 p  U- W3 D. a- k

    1 W1 X+ B* k$ P- `/ {int sum=0;: V  K, s) h; P% o1 Y% }
    int main(){8 [! W. O: d8 D  m1 E5 R
            int n,i;
    - `$ H; u; J+ e, s- b, M- `+ K        char *p;8 t3 M# d2 S  X3 U/ {: s
            void perm(char *,int,int);$ x5 B$ }6 n7 i8 Z

    : m" [, A, R# B2 ]( k        scanf("%d",&n);1 ^, X6 `' \8 n1 n* T* J
            p=new char[n];4 u6 G9 b. Y! H0 E1 t
            for(i=0;i<n;i++){
    ; k- ^* C: d7 j% ^  d7 t                getchar();
    / D$ ~; y7 \+ F* ~' q                scanf("%c",p+i);0 Q  y! y, S7 ~+ n/ O) N8 A/ q0 r
            }7 X. |5 y0 Q4 p' |- B

      n& J7 H2 z- B/ E7 o0 h$ O. @        perm(p,0,n-1);
    $ }8 E$ ^6 |. ~% ^% T6 a' @        printf("==>%d",sum);
    , k8 o2 m9 m: `- z/ f. F/ D) D9 a
            return 0;
    0 r' V2 l# _  ?}2 @5 J9 T5 b- C& E, u
    9 |" Z2 W* ^  G2 a4 k% B
    void perm(char *p,int s,int e){1 P' W2 ]% ]- g! ~( m+ `  V
            int i;$ f# H1 G! w8 n, O' m. c
            void swap(char*,char*);
    4 ^1 E6 |+ Y. D! N- |, E. n        1 G4 a# N, u4 Z8 @8 r
            if(s==e){
    - t( B% N; A( T9 ~( j4 b2 L2 c                printf("%s\n",p);
    - s& G& x0 ^, I" L  ]                sum++;5 n& S, d2 `7 |) @) U
                    return ;
    & [4 [  y5 E$ h9 S6 L        }2 k' D; u6 u! l1 S4 x3 V! k  w
            else{
    & t! z' q5 D: [- H0 ]: x                for(i=s;i<=e;i++){! }  ?9 I) |% q* ?3 }% T
                            swap(p+s,p+i);( N  w: d" z. q% B! x
                            perm(p,s+1,e);
    $ L2 f. T) x, u                        swap(p+s,p+i);8 z# g' ]; n! F
                    }4 M5 ^0 P3 Y* U% j: j  H
            }5 n* d7 N) x' y" o0 c8 f
    }
    8 ~' ^3 A5 u. |  V- u" _2 n- p. [  K% Q$ U) C/ J; Z' r1 A- {
    void swap(char *a,char *b){
    ) n# ^. u& D& l0 o        int tmp=*a;( }3 V4 y5 S- G$ R$ v, O* m
            *a=*b;
    2 d5 W, [& Y2 P- [# [        *b=tmp;+ N/ G4 h% @# ~# y
    }
    2 e* M8 ?6 U$ ?* q4 k* L, K: p' _5 _" b2 \
    ======================================================================
    , Z$ [; O; r$ O' m5 V    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    ! F6 t& v5 e0 c- f  W9 |    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    % Y) g5 U2 b1 h; Y2 u2 v' Y& V& b. r

    ; o: o; d* d2 G& o5 S# \* T# ]% u5 o0 i  k+ g, p3 l8 e
    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-6-14 18:23 , Processed in 0.417853 second(s), 51 queries .

    回顶部