数学建模社区-数学中国
标题:
算法:求全排列的递归算法
[打印本页]
作者:
知道了
时间:
2015-4-16 14:28
标题:
算法:求全排列的递归算法
7 | P3 Q0 u& a' b% A. U# e
0 y- K5 @, k/ ~. k
6 i8 j7 z# l. @5 H3 o- J
/*
* U! e- Q7 t5 D5 ]
使用递归方法求全排列
% x5 C3 }1 ]$ M# G7 [9 u2 O
*/
) s3 F8 s. k1 }" P. B% p
0 e e1 t: O; O) C* [5 g
#include<stdio.h>
2 D( b2 i( ~0 c: f
. |& @; e% |* N- H
int sum=0;
, |: \( m8 [) W# C5 j
int main(){
9 m5 }# U' C9 E; z- G: g; B; x4 C( y: m
int n,i;
' f+ {# ] b; j$ y* h7 h
char *p;
+ W, p; _! A' ~3 B
void perm(char *,int,int);
. w9 E) f$ Y. \8 o
2 O3 [& m5 ]3 n/ Z9 N
scanf("%d",&n);
& G* c7 p5 }9 r5 q8 b' P
p=new char[n];
& u# ^! B2 Z& m) U
for(i=0;i<n;i++){
$ K; N3 v7 u0 c3 A4 F
getchar();
) d) O: D) f! t! ~1 q! _
scanf("%c",p+i);
+ B' H9 J0 n+ T/ o) |6 J
}
9 _+ M! Q; N6 F' N! Q6 s
# s% \6 k7 Z2 B* f
perm(p,0,n-1);
* u5 {* T$ G2 u
printf("==>%d",sum);
2 L6 S$ d3 ?# j1 t# e; C
- X1 E, G' n( q' p p3 t
return 0;
6 Y0 N6 g$ Q0 E8 P2 b
}
; F: P6 L" Z+ ^1 n
4 n9 m+ V6 R9 E8 p2 O; B
void perm(char *p,int s,int e){
/ X- S9 ]; g9 D7 `, j) a
int i;
5 c* ~ i/ D/ j- h: i
void swap(char*,char*);
2 S& |% c0 F- b r, d
* f4 q9 s1 ^6 R; S' l
if(s==e){
) ^, C* o* V4 i) G
printf("%s\n",p);
6 W' o: v7 I& g: `/ }% {. @
sum++;
' ]8 V0 F6 R# l) @! J
return ;
% n; V: h3 v9 M$ c9 o
}
* J1 t* e5 k S/ v* i1 _% d; w
else{
5 d% ^; C4 a4 X% q* } O
for(i=s;i<=e;i++){
1 N; [% B2 X [, b2 y
swap(p+s,p+i);
+ ], g/ O+ d' G6 G3 k. ]
perm(p,s+1,e);
5 C- V9 z) _- p8 f/ G
swap(p+s,p+i);
, Z! g H+ r! l* J$ j6 H0 ]
}
( B; g- t7 Q1 h' W. j2 p" D
}
. v3 I. h* T2 X6 [% Z
}
4 l" O% @2 N7 a) T6 z9 B9 w- P, |% e! q" N
8 ?6 W. X; D$ x; @
void swap(char *a,char *b){
& E2 ?' V9 r( A
int tmp=*a;
% v. G; j+ W3 k. u, S4 l) d" m9 Z
*a=*b;
. E, G2 J2 U2 S; i c
*b=tmp;
0 I+ I; b3 B" F: N' y. M
}
: R% S/ q7 z h
b" C; l8 \/ ^& m# R% k" I1 p
======================================================================
' ^: O# C `" \, B, z
1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
: J+ Z$ B: W, S
2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!
3 L3 E- v- L6 G( ?% Z4 @
. q- x$ e1 `/ Q) c4 |
) d* B% A1 T" s) t1 B+ `
" }" D& ^6 Q0 h0 ]9 ^. P
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5