数学建模社区-数学中国
标题:
算法:求全排列的递归算法
[打印本页]
作者:
知道了
时间:
2015-4-16 14:28
标题:
算法:求全排列的递归算法
' _" Y1 Y1 E" A# g) W0 I5 N
) p6 q. `6 r3 n& @0 @* K
' I$ z* } }, p+ r2 c8 v, g7 d- Y
/*
/ r8 a0 ?$ x: ~9 I5 |, ]
使用递归方法求全排列
: D, L" j# v4 A7 q2 B# s$ j
*/
" G( |% v% i( V
& d$ k8 k4 X, _ z! x- K! \+ j0 e
#include<stdio.h>
1 V( D& ~4 p4 E4 d3 Y5 d' F
: o# o5 [% c1 [- A' O# R& b
int sum=0;
3 `: s; s4 r) [0 @ h$ m
int main(){
" M4 W9 ^, M2 z7 Y/ j; [' A# b2 t
int n,i;
7 k; e$ H* P% X2 |8 b, ~2 f
char *p;
4 e* @9 g- Q5 I4 {
void perm(char *,int,int);
3 p$ c/ f& v6 S
) B) f6 M$ c# d2 }4 B
scanf("%d",&n);
) I# J( D2 s$ d9 U( G
p=new char[n];
" J& I' S: F! O/ x( o/ T
for(i=0;i<n;i++){
: ]* d8 D0 N: z9 Y! a3 ?2 x: M% P
getchar();
6 n# @ w# Y. c8 K+ I+ B! d
scanf("%c",p+i);
* O: _0 e2 J5 a5 e
}
; b* {/ r5 X. V! |: K: L
; w' C+ I; ~, L. l8 G2 d3 n
perm(p,0,n-1);
* a; y* v& @1 d$ A
printf("==>%d",sum);
! `7 g( P0 b1 T; M
( j7 e# [' H5 o4 X+ Q4 u
return 0;
- s* q, B7 x9 R; ~! c. Z
}
" h* L- H+ l5 T( e7 J: c
' \; p+ Z/ M/ Q# t% x: G
void perm(char *p,int s,int e){
0 g2 a3 h" \- M) S0 u; Z" g
int i;
/ K, S" ^& Q! q
void swap(char*,char*);
- |1 m! B$ r4 I5 B) o5 ]4 @: A
3 N( u, `' F( {5 N" O( B
if(s==e){
m6 i4 C0 W/ r" C
printf("%s\n",p);
4 |/ [3 f# S2 l- h
sum++;
2 D/ v9 z$ h; y- G$ _4 Q, | E7 k4 X; @
return ;
1 D* p/ \ J" h+ N0 E
}
4 p" s1 Q x! V0 K1 R8 _0 m9 y
else{
# H# Q7 G% f$ S4 u x. I8 e
for(i=s;i<=e;i++){
: w2 ]8 \. u- ?
swap(p+s,p+i);
- N9 @, y6 ?. ]
perm(p,s+1,e);
3 C& _/ Z7 D- _& G3 {. X
swap(p+s,p+i);
" j1 r P0 S+ {5 `, y& p) i- q
}
# `. Z9 z' ~; Z( l) k6 ~* ~
}
( V0 Y9 D* G" U2 d' ^) {: X
}
4 p: w# m* j8 [ d$ y5 c( r8 K0 _
1 k( f3 r8 z0 K* A. q: @ ]
void swap(char *a,char *b){
$ s& ^8 n2 F8 |& ^& |- }# B9 N
int tmp=*a;
% @, S6 U- c4 Y
*a=*b;
: \) G5 z" l/ M% P
*b=tmp;
4 b: i, D2 l7 m( J
}
0 b: t+ k$ r" Q4 m
5 a6 E9 M; n1 n
======================================================================
& o& `' ^- c) @. o6 A7 b" @
1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
, E0 n# b S# h; H0 W
2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
; L. b9 H1 a4 X( {( e! [+ G3 `6 f
" m: Y2 B( C4 d/ y3 N, @
( R& q1 q, |* u, h0 g
* f3 c/ Y' J/ _ d# s& r
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5