- 在线时间
- 6 小时
- 最后登录
- 2015-5-5
- 注册时间
- 2015-4-8
- 听众数
- 9
- 收听数
- 3
- 能力
- 0 分
- 体力
- 111 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 49
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 27
- 主题
- 14
- 精华
- 0
- 分享
- 0
- 好友
- 7
升级   46.32% TA的每日心情 | 擦汗 2015-5-5 09:17 |
|---|
签到天数: 13 天 [LV.3]偶尔看看II
- 自我介绍
- 往往
 |
# L D) G$ N9 W2 w' A1 a
$ o' F& Q3 ^9 c; ~9 X
- ^ h" e6 g& ^" W/*7 K: n; o1 t# z: _) b, B/ K1 M6 f
使用递归方法求全排列; \$ w# a& S2 ^
*/# Z: v6 h! G: ]7 D) K( U9 V
5 p3 F1 |$ I y
#include<stdio.h>
6 O( Z$ G F1 v1 N. k6 L5 j' [, H1 t2 ]; [; f( S2 ~
int sum=0;1 p% Z7 t3 a0 M$ L: q+ D" V
int main(){
& c0 K& n1 Q7 m) a4 n! |4 e int n,i;
$ l# I5 l' O/ w char *p;* b5 r# T3 @9 _4 M. A- s
void perm(char *,int,int); l* u0 M8 ?9 F6 S
& j% `5 N2 a( i2 \) r scanf("%d",&n);
3 }% K( b0 y6 b2 } p=new char[n];
5 i0 X3 R( t1 {' x P6 k3 { for(i=0;i<n;i++){7 `6 t/ s, ^2 L* {1 O
getchar();( x% M" c2 m8 Y* ]( L
scanf("%c",p+i);
- z! Q; {% G& R4 w }
& J ? E: }0 n# ^3 \: l% E9 n, U) M4 k$ ^. \
perm(p,0,n-1);+ I. q5 \+ b6 D
printf("==>%d",sum);8 C* j2 B2 j* ^1 P" u! V5 U
; l1 D- @/ q' v; p4 F+ T
return 0;0 z9 w, N! E( s, O; E
}! P" b, c) f! F, \- B0 ~9 E
- P! G- a7 U" L5 y- i
void perm(char *p,int s,int e){
" C2 T; h) K' d int i;6 x- N& V5 X! v7 h) e* h; g
void swap(char*,char*);8 W+ V* A; d1 x, c7 J- N" ^5 X2 Q+ K1 Z
$ K4 P, f7 P& ~ k3 n- w
if(s==e){- j' X; ^/ B1 I% B
printf("%s\n",p);
' Q" R m3 `) t' t/ ? sum++;7 Y, P' y/ c! f- U4 C( ]
return ;
; Q& A( T0 h- h0 M9 m }
" x) e% T# s$ I( H% e4 O k else{+ o, d* D# J9 r
for(i=s;i<=e;i++){0 ^' r( h" s. A& A8 X
swap(p+s,p+i);. n8 a" A, R7 z# n3 g
perm(p,s+1,e);
0 c; b+ X: S4 R/ G, T _0 B swap(p+s,p+i);
) H6 ~3 Y" a% R/ J, U$ F }& E& C% Y0 d, r5 G1 H- d
}
1 q1 [! ~+ W3 f6 F}6 V% y3 b. ]1 o1 F! Z
* r8 b' t" r# G' L' Ivoid swap(char *a,char *b){0 O7 j5 t- r) S- O0 z3 ] ?. S
int tmp=*a;
& @2 N; Q# I6 w( Y( a *a=*b;
" B/ H) C5 A" t3 M *b=tmp; n0 b% w% c" s0 U) [
}
+ [3 u7 v% r- |( |2 T* a" ~' V: x; x1 A
======================================================================- j f5 x! x; E4 s
1.关于思路:当仅有一个元素时,全排列就是它自己本身一个;对于多个元素的序列,其全排列为去掉某个元素的全排列,再在这些全排列序列中加入该元素(如果某一个排列序列包含n个元素,那么加入的方案就有n+1个),这等价于每个元素做打头元素,后续的子序列的全排列,而for循环就是体现这一点。
2 j6 T: Q0 _9 z0 }6 y5 j 2.关于输出:一开始我怎么也找不到输出的好办法!第一是尝试在下一层递归前输出字符,发现不行;后来在递归回来后再输出一次,还是不行……总之尝试了很多次都没有效果。最后从另一位大神中才想到有直接输出字符串的控制符!坑呐,说明自己对语法不够熟练,加紧练习!; z- f+ z: Z: S) u
' M+ C# J. ]( j' ?( M
2 l- J! k# J M" `
/ F# \! W% K) A) b5 g. e1 y& W |
zan
|