QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    4 E$ z. j( D7 Z9 J2 J- {9 u
    $ T' z7 Q# c6 _2 A  F& x/ l4 o" H2 f+ Q! g$ M8 j
    /*
    ' y/ V6 }/ f- v3 K) H5 E# Z使用递归方法求全排列1 ?- [7 ]# y4 @
    */* ^  O" g5 A3 u, d8 n, q# X

    ) w0 Q$ M- }( F+ w" v. I% ^. m% H#include<stdio.h>0 p& d/ D2 u, E( s  M+ _' p
    ( W! ]3 F" u1 r& P2 C0 C
    int sum=0;
    ) Y, U9 z, Y1 d9 f- I" y. `/ Wint main(){8 O& t3 k; ~0 i) {
            int n,i;
    1 C! V5 h8 U& s4 q. a        char *p;. R! [. A: }$ ~
            void perm(char *,int,int);
    7 `8 p+ P0 M& U/ L2 x: H- j1 t' f9 l( c3 }( t
            scanf("%d",&n);0 w& l! ]5 C- G8 Z  L* \
            p=new char[n];  Z) r5 N& A* {' V2 a9 D
            for(i=0;i<n;i++){- H" |+ M2 g- A0 ~/ i. J; n1 K
                    getchar();/ ?) K+ y  ]! d) b
                    scanf("%c",p+i);
    2 K& O! |* _7 X+ c& b  B9 |        }
    . _+ J. N, L1 d) e5 k7 y2 G1 W3 a5 s& s3 p2 l- f) Z
            perm(p,0,n-1);
    6 m" z3 v" o. b1 R4 N" {        printf("==>%d",sum);/ |* c" R! p* K# Z9 k

    8 X9 d* s* l% t5 n" m        return 0;# g# p9 R* z; j) E$ g2 Z
    }
    8 p0 |: P% S" x8 z- r# F" N
    : w( }5 N$ A( Q$ H2 g9 d9 u/ ~void perm(char *p,int s,int e){
    7 H+ s: ]2 `) k! X7 S' H        int i;# ~" l- y; N# Z7 V0 f
            void swap(char*,char*);
    ) }% L# q: O3 c2 q) b5 _4 G' y9 L        
    % C* k1 w2 m- q/ \' I        if(s==e){6 q0 S: B& @3 f" E0 X, y) @( ]  U
                    printf("%s\n",p);
    5 _8 n9 B. ?1 k6 h7 f6 k                sum++;
    ! h. ?; E. N5 h) p8 B                return ;
    * a" y- R0 C- z% {& B, `        }5 K6 t3 F1 X/ k
            else{
    2 }9 X1 d8 Q  g# _( Y3 O6 u" q                for(i=s;i<=e;i++){3 D7 i! u% h* [
                            swap(p+s,p+i);
    4 F# Q. U  Y6 Q                        perm(p,s+1,e);* G2 ^0 f  B/ m
                            swap(p+s,p+i);2 D( z5 [8 B! Q) m" E
                    }& a0 j8 S8 S3 f3 i3 c- k
            }2 g  ~9 v/ Q% X& C, P& {  c
    }; g/ Q( e5 B. R# D. J0 C5 b$ d5 a
    ) K# s9 L. N- }9 ?
    void swap(char *a,char *b){' Z/ j3 `7 B( G8 p% t4 l8 {
            int tmp=*a;% F5 k( z& n% N
            *a=*b;
    , L. K% T8 c+ s. P- q2 ^$ j9 Q0 P        *b=tmp;- s9 ]7 T4 v( U7 G9 j
    }2 d$ k: x) W7 T. T1 e

    ' Z; }9 k1 _  o. h2 p======================================================================5 _  Q  K( d. H* k9 v5 L
        1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
    4 W* Q- ~6 \4 Q! R    2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    ' b/ ]& x* f$ Y) W1 ?( }1 o
    . o- S4 f: m! \$ i" L/ I# @8 Q. b0 S
    8 B. b! ^( n, @) Y/ l
    0 F2 Q, `/ y+ k% F
    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-11 09:11 , Processed in 0.322167 second(s), 51 queries .

    回顶部