QQ登录

只需要一步,快速开始

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

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

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

14

主题

9

听众

49

积分

升级  46.32%

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

    [LV.3]偶尔看看II

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

    " e+ z% X$ I) i1 G
    2 H3 \4 C# @* S6 Y) |
    2 G, u9 g( C  V  |9 T) m3 w. y6 a9 a/*
    . _4 r  i( T: |) z5 q/ d/ s" `) H使用递归方法求全排列
      s9 D) D1 p  x$ f* K/ ^*/) S* J; k4 U. f: H; x5 H, L2 O

    2 B6 ~* y# N3 L0 z#include<stdio.h>/ ]9 m6 w8 u1 N6 N' v5 D

    5 b6 B! P: O9 f- \, |$ qint sum=0;, A+ i1 R1 F4 t  M. W3 y
    int main(){/ o0 m, K6 ^/ i, H# I2 K7 v
            int n,i;
    , N# x5 w5 d% H        char *p;
    4 [' t9 P3 J4 c0 j8 D4 o+ X: k/ i        void perm(char *,int,int);
    / n$ I; |" ]' Q& k* |1 s5 t' p2 B: Z. k9 a
            scanf("%d",&n);' ]* o  v9 A9 u, u$ F& q
            p=new char[n];3 v1 @9 `+ A; |
            for(i=0;i<n;i++){. v3 @  j" t; j9 t3 F$ O5 s# K
                    getchar();
    6 _! R4 l* E: i0 K$ T+ k                scanf("%c",p+i);
    ( P; E( c6 k# J9 T( w        }
      u: a, y: C2 W. j4 q9 S) x7 c" ~. S/ G! c4 o- G: \
            perm(p,0,n-1);3 d% d2 d6 _/ z8 p5 u
            printf("==>%d",sum);: k9 X+ u6 x1 T' v& g# O
    1 F. ^2 S+ w: U5 ], `1 h- u9 E, U7 t
            return 0;
    " p3 C2 m1 I4 V: ?9 d}. \! N) K7 y% o9 F8 S& r8 e, G8 z
    - r& i( H0 ]: ~, J7 p
    void perm(char *p,int s,int e){( m/ e5 ]+ w. T3 a# w' a
            int i;" U7 n* M: f8 ?# B: F9 x6 N
            void swap(char*,char*);; N) D; s/ m: N6 O0 s
            * j) B  R9 q. |6 S
            if(s==e){
    " Z2 C8 Z* ~. C( m; _                printf("%s\n",p);
    " [# Y8 h# D' t% j3 e                sum++;
    / N/ s( e) C) l8 k                return ;2 R# ^; L/ z- R* U& @* k' J
            }
    5 [5 D) @- ?; k4 k+ }        else{
    4 c: n$ p5 ^" y! T+ {1 m                for(i=s;i<=e;i++){/ S0 s. ~% I1 L$ s
                            swap(p+s,p+i);( e# L+ V8 H* S
                            perm(p,s+1,e);7 r5 Z8 x  b. H- I0 n
                            swap(p+s,p+i);
    - ?2 v$ p) S# O# W4 o. N                }
    : {+ w2 t/ R' k9 i  {1 T) v  B        }: C- ?" ]& Q8 x
    }6 V, C' V; ]* K  }) g$ x+ b

    4 W: V* z. T( G: X8 d9 Jvoid swap(char *a,char *b){$ w7 k9 V  }2 u  G- N' v4 Z& _8 i' m
            int tmp=*a;
    . ]4 ^, V; s' j        *a=*b;6 E; \- \6 u7 u0 ^- Z/ h, h
            *b=tmp;9 @1 K- [! W1 u3 D
    }
    4 e& g% N$ i5 J5 p
    0 A" _0 t" q* A  ?8 r5 e: [' l======================================================================
    % S) O! g6 K+ M+ j% k    1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。9 p1 C) s% I  h" |  D( x1 @
        2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
    + N4 D  ~5 s" g" O% v: w
    $ L, Y( F0 v& K$ x- y
    1 C( f2 i( V! L6 w- \: u, E# `! n/ _7 p- Z8 `1 [$ x4 H, {- ^
    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-8-31 17:05 , Processed in 0.406549 second(s), 51 queries .

    回顶部